两个列表的排列

时间:2013-02-06 23:28:39

标签: ocaml

我在OCAML中有一个char list。我想创建( (char * bool) list) list chartruefalse的每个组合的List.fold_left

我猜我必须做的事情就像是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'] [];; ,但我不太清楚如何把它拉下来。

这是我尝试的大纲(OCAML语法,但不能运行):

[
    [('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 )];
]

应该返回(顺序并不重要)

{{1}}

1 个答案:

答案 0 :(得分:2)

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

  • 您必须删除递归调用中的_intern后缀
  • “options”参数没用(看看你如何进行递归调用,只传递一个参数v'),所以你必须找出{{}中要返回的内容。 1}} case
  • 串联“[]的结果,加上头部变量的v'”和“true的结果,加上头部变量的v'”应该写成false而不是foo @ bar,因为这两个列表是你连接的,而不是一个元素添加到列表中。