1

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

我猜我必须做的是类似 a 的事情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 )];
]
4

1 回答 1

2

您已接近正确的解决方案。具体来说:

  • 您必须删除_intern递归调用中的后缀
  • “options”参数是没用的(看看你是如何进行递归调用的,只传递一个参数v'),所以你必须找出在这种[]情况下要返回什么
  • 应该写“的结果v',加上true头部变量”和“结果v',加上头部变量”而不是,因为这些是你要连接的两个列表,而不是添加到列表中的一个元素。falsefoo @ barfoo :: bar
于 2013-02-06T23:36:32.887 回答