2017-01-12 2 views
2

Ich versuche, manipulierte Lambda-Ausdrücke in SML NJ zu verwenden, und aus irgendeinem Grund erhöht es Fehler. der Code in meinem "program.sml":Syntaxfehler in Teilfunktionsanwendung

fun add x y = x + y; // (x. y. A x y) 
fun plus = add 1; // (x. y. A x y) 1 --> (y. A 1 y) -(e.g.)plus 4=5 

Fehler nach Befehl ‚Verwendung "program.sml" in ubuntu-Terminal:

program.sml:2.5-2.9 Error: can't find function arguments in clause 
uncaught exception Error 
raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27 
     ../compiler/TopLevel/interact/evalloop.sml:44.55 
     ../compiler/TopLevel/interact/evalloop.sml:292.17-292.20 

Es ist auf jeden Fall die "plus" Linie, da ansonsten kein Fehler. und ich habe 'Spaß plus = (add 1);' (Klammern), was denselben Fehler hervorruft. Vielleicht fehlt mir ein Paket oder was auch immer. kann mir das jemand erklären?

+0

Eine Funktion, die einen Eingang zu ihrem Eingang hinzufügt, könnte "Incr" oder "Succ" heißen. –

Antwort

3

Mit

fun add x y= x + y; 

Sie sind (richtig), der eine Funktion. Sein Typ ist

fn: int -> int -> int 

was bedeutet, dass es sich um eine Funktion höherer Ordnung ist, die eine int als Eingabe und gibt einen Funktion von int -> int als Ausgabe.

Sie müssen jetzt nur verwenden diese Funktion, um einen neuen Wert zu definieren, plus (die eine Funktion an sich ist).

So (wie @jacobm bereits darauf hingewiesen hat), verwenden Sie einfach:

val plus = add 1; 

Die Subtilität ist, dass in SML-Funktionen sind "First-Class-Werte". Zusätzlich zu definieren sie auf der obersten Ebene mit fun Sie können sie frei erstellen und sie als normale Werte übergeben. Einer der Gründe für das Definieren einer Funktion in einer Curry-Form (wie Sie add definierten) besteht darin, dass Sie sie als Funktionsfactory verwenden können, um Funktionen nach Bedarf zu erstellen, ohne sie explizit zu definieren.

Übrigens ist der Titel Ihrer Frage etwas irreführend. In SML ist der Ausdruck "Lambda-Ausdruck" normalerweise für anonyme Funktionen reserviert, die mit fn erstellt wurden. Die Lambda-Kalkül-Syntax x. entspricht fn x => in SML. Wenn Sie definieren add explizit als Lambda-Ausdruck wollte verwenden Sie:

val add = fn x => fn y => x + y; 

Beachten Sie, dass Lambda-Ausdrücke müssen nicht das Schlüsselwort fun zu definieren.

4

val plus, nicht fun plus. fun plus ist eine spezielle Syntax zum Definieren einer Funktion, indem der Körper der Funktion angegeben wird; val plus bedeutet "definieren Sie den Namen plus als was auch immer auf der rechten Seite ist", was in diesem Fall eine Funktion ist.