2013-02-06 60 views
1

我在OCAML中有char list。我想创建char的每个组合truefalse((char * bool) list) list两个列表的排列

我猜我必须做的是类似于List.fold_left,但我不太确定如何将其关闭。

这是我试过的轮廓(OCAML语法,但没有可运行的):

let rec var_perm var_list options = 
    match var_list with 
     | [] -> options 
     | x :: v' -> 
      ((x, true) :: (var_perm_intern v')) :: ((x, false) :: (var_perm_intern v')) 
;; 

let all_options = var_perm ['a';'b'] [];; 

应该返回

[ 
    [('a',true);('b',true)]; 
    [('a',true);('b',false)]; 
    [('a',false);('b',true)]; 
    [('a',false);('b'false)]; 
] 

编辑:又如:

let all_options = var_perm ['u';'w';'y'] [];; 

应该返回(顺序不重要)

[ 
    [('u',false);('w',false);('y',false)]; 
    [('u',false);('w',false);('y',true)]; 
    [('u',false);('w',true);('y',false)]; 
    [('u',false);('w',true);('y',true)]; 
    [('u',true);('w',false);('y',false)]; 
    [('u',true);('w',false);('y',true)]; 
    [('u',true);('w',true);('y',false)]; 
    [('u',true);('w',true);('y',true)]; 
] 
+0

http://stackoverflow.com/questions/10893521/how-to-take-product-of-two-list-in-ocaml –

+0

@GeneT不一样,我在找什么。这将返回包含所有选项的单个列表。我需要列表清单(正如你在问题中看到的那样)。 – yakatz

回答

2

您已接近正确的解决方案。具体做法是:

  • 必须删除_intern后缀的递归调用
  • “选项”参数是无用的(看你怎么做你的递归调用,只传递一个参数v'),所以你必须找出在[]情况下返回
  • 的串联“的v'的结果,加上true的头部VAR”和“v'的结果,加上false的头部VAR”应写foo @ bar而非foo :: bar,因为这些是你连接的两个列表,而不是一个元素添加到列表中。
+0

我使用'选项'作为累加器。我知道他们不匹配,但我不确定我是否真的需要它。我会多尝试一下。 – yakatz

+0

“我需要一个累加器”通常是一种很好的方式,出于习惯,不要从表面看问题并从该规范中获得解决方案。空列表的选项是什么?给定'li'的一组选项,'var :: li'应该返回哪些选项?那里,你的功能。 – gasche

+0

关于'foo @ bar'的第三条建议不会生成我正在寻找的列表列表。思考? – yakatz