OCaml - 通过重复找到所有可能的变化

时间:2016-11-05 14:41:07

标签: list unit-testing recursion ocaml

我有~10个想要编写测试的函数,它们都有两个相同类型的参数。我想我可以稍微自动化一下这个过程,创建一个包含所有可能输入类的列表,然后只重复打印所有可能的变化到文本文件。我的代码,然而,并没有完成这项工作,只列出以“a”开头的变体。

let x = ["a "; "b "; "c "; "d "; "e "; "f "; "g "; "h "]
let oc = open_out file

let rec test l1 l2 =
    match l1 with
    |[] -> 0
    |h1::t1 ->
        match l2 with
        |[] -> test t1 l2
        |h2::t2 ->
            fprintf oc "%s\n" (add ^ h1 ^ h2);
            fprintf oc "%s\n" (sub ^ h1 ^ h2);
            fprintf oc "%s\n" (mul ^ h1 ^ h2);
            fprintf oc "%s\n" (div ^ h1 ^ h2);
            test l1 t2;;
test x x;
close_out oc;

2 个答案:

答案 0 :(得分:0)

在行|[] -> test t1 l2中,您使用l2的空列表进行递归调用。我相信你想要使用初始值l2(在你的例子中为x)进行调用,然后你需要存储在实际递归之外的某个地方。像

这样的东西
let test original_l1 original_l2 =
  let rec loop l1 l2 =
    ...
      | [] -> loop l1 original_l2
    ...
    in
  loop original_l1 original_l2

答案 1 :(得分:0)

另一种方法是使用Monads(参见ocaml courses的第5页):

let return x = [x];;
let bind f l = List.fold_right (fun x  acc -> (f x) @ acc) l [];;
let (>>=) l f = bind f l;;
x >>= fun t ->
x >>= fun t' -> 
["add ";"mul ";"sub ";"div "] >>= fun op -> return (op ^ t ^ t') ;;

它将返回一个表示x * x * Ops的笛卡尔积的列表。

可能有更好的方法来使用ocaml电池似乎可以实现笛卡尔产品所需的所有东西。