2014-01-19 13 views
6

ich eine einfache Funktion haben:OCaml Currying/Mehrere Argumente

let rec ap x y = if x < 10 then 12 else ap((x-1) (y));; 

aber die Fehler, die ich auf immer halten ist:

Error: This expression has type int 
    This is not a function; it cannot be applied. 

Ich habe jetzt 2 Stunden auf dieser aufgeklebt, i kann nicht herausfinden, warum das nicht funktioniert?

Auch ich habe nur die Funktion vereinfacht, denn in meinem eigentlichen OCAML-Code läuft das Problem darauf hinaus. Ich bin mir nicht sicher, ob das mit Curry zu tun hat, aber kann jemand bitte erklären, warum das passiert?

+1

Die eigentliche Fehlermeldung zeigt die genaue Position des Problems an, die '(x-1)' ist. –

Antwort

6

Der OCaml-Compiler berücksichtigt, dass Sie (x-1) auf (y) in ((x-1) (y)) anwenden. Deshalb erhalten Sie den Fehler: "Dieser Ausdruck hat den Typ int. Dies ist keine Funktion; er kann nicht angewendet werden."

Eigentlich muss man p (x-1) (y) schreiben, weil ap zwei Argumente braucht.

Denken Sie daran, dass in OCaml (oder andere Hindley-Milner abgeleitete Sprachen: SML, Haskell) Klammern sind nicht erforderlich, um Funktionen anzuwenden und dienen einem anderen Zweck als C wie Sprachen.