2016-11-05 18 views
1

私はテストを書くために〜10の関数を持っています。それらはすべて同じ型の2つの引数をとります。すべての可能な入力クラスのリストを作成し、可能なすべてのバリエーションを繰り返してテキストファイルに出力するだけで、プロセスを少し自動化できると思いました。私のコード、howewerは、 "a"で始まるバリエーションのみをリストしています。あなたはl2のための空のリストと再帰呼び出しを行う|[] -> test t1 l2ラインで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

。私は代わりにl2(例ではx)という初期値で呼び出したいと考えています。実際の再帰の外側に格納する必要があります。

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 *オプスのデカルト積を表すリストを返します:

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ページを参照)モナドを使用することです。

ocamlを使う良い方法があるかもしれませんが、デカルト製品を行うために必要なすべてのものを実装しているようです。

関連する問題