2016-11-05 44 views
1

我有〜10個函數,我想寫測試,它們都採用相同類型的兩個參數。我認爲我可以自動化一些過程,創建所有可能的輸入類的列表,並將所有可能的變體重複打印到文本文件中。我的代碼很不完整,只列出了以「a」開頭的變體。OCaml - 找到所有可能的變化與重複

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

|[] -> 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 
0

另一種方法是使用單子(見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 *行動的笛卡爾積名單。

可能有更好的方法來使用ocaml電池,似乎實現所有東西需要做笛卡爾產品。