2016-04-22 11 views
0

Warum kompiliert dies?Variable wird nach Druckanweisung vergessen

fun foo (h::t) = 
    h = hd(t); 

Aber dies bedeutet nicht

fun foo (h::t) = 
    PolyML.print (h::t); 
    print "\n"; 
    h = hd(t); 

?

Value or constructor (h) has not been declared Found near =(h, hd(t)) 

Value or constructor (t) has not been declared Found near =(h, hd(t)) 
Exception- Fail "Static errors (pass2)" raised 

Antwort

2

Ich denke, Ihre Frustration mit der Sprache, die Sie Ihr Problem aus der Lösung verhindert (n) mehr als die Grenzen der Sprache. Wie ich bereits in einer früheren Antwort gesagt habe, können Semikolons nicht so verwendet werden, wie Sie sie benutzt haben. Sie müssen diese Aussagen in Klammern wickeln:

fun foo (h::t) = 
    (
    PolyML.print (h::t); 
    print "\n"; 
    h = hd(t) 
) 

Des Weiteren Sie erste Schnipsel benötigen kein Semikolon:

fun foo (h::t) = 
    h = hd(t) 

Hier ist das Ding, in SML Semikolons werden nicht verwendet, Aussagen zu beenden, sie werden verwendet, um Ausdrücke zu trennen. Denken Sie an ; als binärer Operator, wie + oder -. Mit der zusätzlichen Einschränkung, dass Sie Klammern benötigen.

Sie verwenden wahrscheinlich auch den = Operator in der falschen Weise innerhalb . Es ist keine Zuweisung, es ist eine Gleichheitsprüfung, genau wie == in anderen Sprachen. Wenn Sie eine Zuweisung wünschen, benötigen Sie einen Typ ref.

Es ist wahrscheinlich besser zu fragen, was genau Sie versuchen zu lösen, weil Sie an dieser Stelle die Syntax und Semantik von SML total falsch verstehen und wir können hier wirklich kein Tutorial schreiben.