ich eine Funktion für einen neuen Datentyp in Standard ML machen will, der Datentyp intnest genannt wird, definiert als die folgenden:Standard ml hinzufügen, Elemente in einem benutzerdefinierten Datentyp
datatype intnest =
INT of int
| LIST of intnest list;
und ich möchte eine Funktion machen dass alle Zahlen in der intlist fügt hinzu, habe ich versucht, den folgenden Code:
fun addup (INT n) = n
| addup (LIST x::xs) = x + addup(xs);
Was mache ich falsch?
EDIT:
Ich habe auch versucht die folgenden:
fun addup (INT n) = n
| addup (LIST x::xs) = addup(x) + addup(xs);
so dass x vom Typ INT ist so die erste Option, die int-Wert zurückgibt und die addup (xs) ist eine rekursive Aufruf zurückkehren die gleiche zweite Option.
auch versucht, die folgenden:
fun addup (INT n) = n
| addup (LIST []) = 0
| addup (LIST x::xs) = addup(x) + addup(LIST xs);
aber ich bekomme die folgende Fehlermeldung:
stdIn:146.4-151.50 Error: parameter or result constraints of clauses don't agree [tycon mismatch]
this clause: intnest list -> 'Z
previous clauses: intnest -> 'Z
in declaration:
addup =
(fn INT n => n
| LIST nil => 0
| :: (<pat>,<pat>) => addup <exp> + addup <exp>)
stdIn:151.25-151.50 Error: operator and operand don't agree [tycon mismatch]
operator domain: intnest
operand: intnest list
in expression:
addup x
Ich habe dich nicht ganz verstanden, ist nicht xs eine Liste von innersten? –
@ aizen92 Ja, genau das ist es. Aber der Typ, den du für 'addup' brauchst, ist' innerest'. Ihr 'LIST'-Fall wird * unter Verwendung einer 'innersten Liste' implementiert, ist aber * nicht * eine 'innerste Liste'. Es könnte helfen, die Typen von 'xs' und' LIST xs' zu vergleichen. –
Das Problem war mit den Klammern zwischen x :: xs, aber ich verstehe nicht ganz, warum das ist, wird nicht x :: xs als ein Objekt betrachtet, das ist eine Liste? –