2016-11-05 1 views
1

Ich habe ~ 10 Funktionen, für die ich Tests schreiben möchte, sie alle nehmen zwei Argumente des gleichen Typs. Ich dachte, ich könnte den Prozess ein wenig automatisieren, eine Liste aller möglichen Eingabeklassen erstellen und alle möglichen Variationen mit Wiederholungen in eine Textdatei drucken. Mein Code funktioniert allerdings nicht ganz, nur die Variationen, die mit "a" beginnen.OCaml - Finden Sie alle möglichen Variationen mit Wiederholungen

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; 

Antwort

0

In der Zeile |[] -> test t1 l2 Sie l2 einen rekursiven Aufruf mit der leeren Liste. Ich glaube du willst stattdessen den Aufruf mit dem Initialwert l2 (x in deinem Beispiel) machen, was du dann irgendwo außerhalb der eigentlichen Rekursion speichern müsstest. So etwas wie

let test original_l1 original_l2 = 
    let rec loop l1 l2 = 
    ... 
     | [] -> loop l1 original_l2 
    ... 
    in 
    loop original_l1 original_l2 
0

Ein anderer Weg, es zu tun ist, Monaden zu verwenden (siehe Seite 5 von ocaml courses):

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') ;; 

Es wird eine Liste zurück, das kartesische Produkt von x * x * Ops darstellt.

Vielleicht gibt es einen besseren Weg, um ocaml Batterien zu verwenden, die alle notwendigen Dinge zu implementieren scheint, kartesischen Produkt zu tun.

Verwandte Themen