2016-07-17 12 views
0

Ich versuche, eine neue Liste aller eindeutigen Elemente aus einer anderen Liste zu erstellen. Meine in_list-Funktion funktioniert ordnungsgemäß und gibt einen Wert zurück, der besagt, ob der Wert in der seen_liste gefunden wird oder nicht, aber ich kann nicht für das Leben von mir das kompilieren lassen.Unbekannter Typ Fehler in OCaml

let uniq x = match in_list x seen_list with 
    | true -> seen_list 
    | false -> [email protected][x] 
    | _ -> seen_list 
;; 

List.iter uniq check_list;; 

Das Problem ist eine Art von Typfehler. Hier ist sie:

Error: This expression has type int -> int list 
     but an expression was expected of type int -> unit 
     Type int list is not compatible with type unit 

Antwort

1

Im Wesentlichen das Ergebnis von uniq zurücknehmen wollen, und übergeben Sie es wie die Liste für den nächsten Aufruf von uniq. Um dies zu tun, müssen Sie eine Falte verwenden oder Ihre eigene Rekursion schreiben. Der Zweck von List.iter ist nur eine imperative Funktion für jedes Element einer Liste aufzurufen. Es kombiniert die Antworten in keiner Weise. Aus diesem Grund erhalten Sie einen Typfehler - Ihre Funktion ist nicht zwingend erforderlich. Das heißt, es gibt keine Einheit zurück.

0

Vielleicht ist es das, was Sie wollen:

let rec uniq_list lst = 
    match lst with 
    | [] -> [] 
    | x :: xs -> 
     let r = uniq_list xs in 
     if in_list x r then r else x :: r 

Oder mit List.fold_right (äquivalent zu der rekursiven Funktion oben):

let uniq_list lst = 
    List.fold_right 
    (fun x r -> if in_list x r then r else x :: r) 
    lst 
    [] 

Oder List.fold_left verwendet, die tail-rekursive ist:

let uniq_list lst = 
    List.fold_left 
    (fun r x -> if in_list x r then r else x :: r) 
    [] 
    lst 

Übrigens ist Ihr in_list gleichwertig zur Standardbibliotheksfunktion List.mem.