2012-03-26 16 views
2

Ich arbeite an einem Projekt mit OCaml und es gibt einige Probleme in Bezug auf Arrays, die ich nicht sicher bin. Ich darf das List-Modul nicht verwenden, also bitte geben Sie mir eine Idee oder einen Vorschlag mit meinen Arbeiten.Finden Sie einzigartige Elemente in einer Liste in OCaml

Zuerst habe ich realisiert bereits eine Funktion 'a list -> 'a listuniq genannt, die eine Liste der uniq Elemente in einem Array zurück, zum Beispiel uniq [5;6;5;4] => [6;5;4]

Hier meine Implementierung ist:

let rec uniq x = 
let rec uniq_help l n = 
    match l with 
     [] -> [] 
    | h :: t -> uniq_help t, n if (n = h) else (h :: (uniq_help(t, n))) 
match x with 
    [] -> [] 
| h::t -> uniq_help t, h 
;; 

imot sicher, dass dies eine korrekte Implementierung, kann mir jemand einen Vorschlag oder eine Korrektheit geben?

+0

Der Code wie angegeben kompiliert nicht für mich. Es sieht so aus als ob du irgendwo ein 'In' vermisst. Die Methode zur Definition eines lokalen Symbols wie 'uniq_help' ist' local = in '. –

+0

Sie sind keine Arrays in OCaml, sie sind Listen. Arrays implizieren einen veränderlichen Zustand, der in ocaml nicht so funktioniert, wie die Listen, ohne explizit etwas aus dem Array-Modul zu verwenden. –

Antwort

6

Sie Funktionen sind syntaktisch falsch aus verschiedenen Gründen:

  • uniq_help nimmt zwei Elemente, so dass Sie es uniq_help t n mit aufzurufen, nicht uniq_help(t, n) und dergleichen.
  • ein if/else Ausdruck sollte die Form von if cond then expr1 else expr2 haben.
  • zu verwenden uniq_help lokal in uniq, benötigen Sie ein in Stichwort.

Nach Syntaxfehler Fixierung sieht Ihre Funktion wie:

let rec uniq x = 
    let rec uniq_help l n = 
    match l with 
    | [] -> [] 
    | h :: t -> if n = h then uniq_help t n else h::(uniq_help t n) in 
    match x with 
    | [] -> [] 
    | h::t -> uniq_help t h 

jedoch sicher sein, dass jedes Element in der Liste ist einzigartig, Sie Einzigartigkeit für alle seine Elemente zu überprüfen. Eine schnelle Lösung könnte sein:

let rec uniq x = 
    (* uniq_help is the same as above *) 
    match x with 
    | [] -> [] 
    | h::t -> h::(uniq_help (uniq t) h) 
+0

Zu meinem Verständnis fügt die unip_help das letzte Vorkommen des Elements in der Liste hinzu, aber das letzte Vorkommen wird auch mehrmals in der Liste hinzugefügt !!! – overloading

Verwandte Themen