Es gibt mehrere Probleme:
1) Sie haben eine überflüssige unerreichte linke Klammer in der Linie
if (getTransIndex(t,L)<>~1 then
2) SML können die )<>~1
nicht analysieren. Sie sollten Räume einführen um <>
zusammen diese beiden Punkte, so sollte diese Zeile lesen:
if getTransIndex(t,L) <> ~1 then
3) Die Linie getTransIndex(_,[])=~1;
macht wirklich keinen Sinn. _
ist kein gebundener Wert, der an getTransIndex
übergeben werden kann und die leere Liste []
wird nicht von dem einzigen Muster abgedeckt, das in der Definition h::L
verwendet wird. Sie müssen entweder eine Definition für getTransIndex(t,[])
angeben oder die leere Liste nicht übergeben. On Edit: Wie @molbdnilo darauf hingewiesen hat, war dies wahrscheinlich der Basisfall. Wenn ja, es fehlt die |
und ist auch etwas fehl am Platz, da es idiomatisch ist, den Fall []
zuerst zu haben.
4) Die let val i = 0 in
ist etwas sinnlos. Warum nicht den Literalwert 0
verwenden und die let ... in ... end
loswerden.
5) TRANSACTION
und TRANSLIST
sind offenbar Typen. Es ist Standard-SML-Verwendung, kleinere Fälle für Typen zu verwenden und Großbuchstaben für Konstruktoren in abstrakten Datentypen zu reservieren.
Putting all dies zusammen (und mit int
als Stand-in für Ihre TRANSASCTION
) führt zu Code wie:
type transaction = int
type translist = int list
fun getTransIndex(_,[]:translist) = ~1
| getTransIndex(t:transaction,(h::L)) =
if (h=t) then
0
else
if getTransIndex(t,L) <> ~1 then
getTransIndex(t,L)+1
else ~1;
Es gibt keinen Grund explizit SML zu sagen, dass ~1
ein int. Auf der anderen Seite funktioniert _:transaction
nicht wie vorgesehen, da _
kein gewöhnlicher Bezeichner ist, also habe ich den Typ Annotation :transaction
in die Zeile verschoben, die t
enthält.
Was ist die eigentliche Fehlermeldung? –