2012-03-29 7 views
1

Ich möchte eine Funktion, die eine Mylist-Wert umzukehren. Ich habe Code geschrieben, aber es funktioniert nicht, und ich würde mich über Tipps und Hilfe freuen.Reverse-Funktion und Append-Funktion an benutzerdefinierte Liste Standard ml

der Datentyp-Code:

datatype 'element mylist = 
    NIL 
| CONS 'element * 'element mylist; 

und die Funktionen, die ich geschrieben sind:

fun reverse NIL = NIL 
    | reverse (CONS(x, xs)) = CONS((reverse xs), x); 

Ich möchte auch eine Funktion schreiben, die 2 mylist Werte anhängt, habe ich einige Fälle, aber es hat nicht funktioniert aber ich von der folgenden:

aber es funktioniert nicht, gibt mir Fehler, was falsch ist wi Mein Code?

Dank

Antwort

1

In append Funktion, Sie haben zwei Fehler:

  • duplizierten Mustervergleich Fälle von append NIL und append (CONS(x, xs)).
  • Nicht erschöpfende Musteranpassung in Lambda von fn NIL => ... und dergleichen.

Logik von append ist ebenfalls falsch. Es sollte etwas sein wie:

fun append NIL ys = ys 
    | append (CONS(x, xs)) ys = CONS(x, append xs ys) 

Die Funktion reverse einen Typenkonfliktfehler hat. Da reverse xs eine Liste ist, gibt CONS(reverse xs, x) keine Überprüfung ein. Eine schnelle Lösung ist reverse für die Implementierung append zu verwenden:

fun reverse NIL = NIL 
    | reverse (CONS(x, xs)) = append (reverse xs) (CONS(x, NIL)) 
+0

Ich habe die duplizierten Pattern-Matching-Fälle, die du erwähnt hast, nicht ganz verstanden, jeder Fall hat ein anderes Fn darin, warum wird es immer noch als dupliziert betrachtet? –

+1

Weil die Teile auf der linken Seite vor '=' gleich sind, kann der Compiler nicht zwischen ihnen unterscheiden. – pad

+0

Ich sehe, also, wenn ich etwas Ähnliches zu den 4 Fällen machen möchte, die ich vorher habe, also in der Fn-Aussage, wenn ich ein if für den zweiten Parameter verwende, wird es dasselbe sein, was ich in den 4 Fällen will? Es ist irrelevant, was man für zukünftige Referenz wissen sollte –

2

Ein klassischer Weg, um eine Liste rückgängig zu machen, ist es, einen Schwanz rekursive Hilfsfunktion zu verwenden, etwa so:

fun helper accumulator NIL = accumulator 
    | helper accumulator CONS(x, xs) = helper CONS(x, accumulator) xs 

Jetzt wird umgekehrt einfach:

val reverse = helper NIL