我有~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;
答案 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电池似乎可以实现笛卡尔产品所需的所有东西。