2017-02-11 3 views
-1

ausgelöst Ich habe den folgenden Code in SML geschrieben, aber ich stieß auf Kompilierfehler.Exception compile ist in SML

fun getTransIndex(t : TRANSACTION, (h::L) : TRANSLIST) : int = 
    let val i=0 
    in if (h=t) then i 
     else 
     if (getTransIndex(t,L)<>~1 
     then getTransIndex(t,L)+1 
     else ~1 
    end 

getTransIndex(_,[])=~1; 

TRANSACTION ist ein Index mit Werten: 1..3 TRANSLIST ist die Liste von Transaktions

Funktion getTransIndex eine Transaktion Identität von colset Transaktion als ersten Parameter und eine Liste der Transaktionen mit colset TRANSLIST nimmt als zweiter Parameter und gibt den Index der Position der Transaktion in der Liste (gezählt von 0) zurück. Wenn die Liste diese Transaktion nicht enthält, gibt die Funktion -1 als Ergebnis zurück.

Also ich möchte die Probleme beheben. Was ist die Lösung?

+0

Was ist die eigentliche Fehlermeldung? –

Antwort

2

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.

+0

Sehr gründliche Rückmeldung. :) –

+0

Ich denke, die Zeile 'getTransIndex (_, []) = ~ 1;' soll die Definition für die leere Liste sein, aber ihr '|' fehlt. – molbdnilo

+0

@molbdnilo Sie sind zweifellos richtig.Ich bin so daran gewöhnt, leere Listenbasisfälle zuerst in einer Definition zu sehen, die ich diese Zeile als einen Testfall für die Funktionsdefinition darüber gelesen habe. Ich werde die Antwort bearbeiten. Vielen Dank. –