2016-12-15 3 views
1

Ich lerne Haskell. Ich habe erfahren, dass jede Funktion in Haskell nur ein Argument haben kann. Also, wenn Sie eine Funktion max 2 4 sehen; es ist tatsächlich (max 2) 4. Was sie sagen, ist, dass 1st 2 (als Parameter) auf max angewendet wird, die eine Funktionen zurückgibt, die 4 als Parameter verwendet. Was ich nicht verstehe, ist was passiert, wenn 2 auf max angewendet wird? Was bedeutet es, dass es eine Funktion namens (max 2) zurückgibt?Wie funktionieren Curry-Funktionen in Haskell?

Lassen Sie mich ein anderes Beispiel geben, um meine Frage klarer zu machen. Nehmen Sie diese Funktion: multiply x y x = x*y*z. Sie sagen, dass es tatsächlich auf diese Weise ausgewertet wird: ((multiply x) y) z. Nun gebe ich diesen Eingang: multiply 2*4*5 Wie wird das ausgewertet?

multiply 2 

kehrt (multiply 2) und 4 wird als Parameter angewendet:

(multiply 2) 4 

Nun, was diese Rückkehr tut - ((multiply 2) 4) oder multiply 8? Wenn es bei diesem Schritt 4 und 2 multipliziert, wie weiß Haskell, dass es das tun muss (weil die Funktion nur 3 Parameter multiplizieren kann)?

+4

Wenn Sie '(multiplizieren Sie 2) 4' aufrufen, ist der resultierende Wert' (multiplizieren Sie 2) 4', oder expliziter '\ x -> multiplizieren Sie 2 4 x'. In diesem Stadium findet keine zusätzliche Bewertung statt, weil dies nicht möglich ist. Sobald ein Funktionsaufruf vollständig gesättigt ist (und sein Wert ist erforderlich, da Haskell faul ist, aber das hat nichts mit Curry zu tun), wird die Funktion dann und nur dann angewendet. –

+1

Wenn du "multiplizieren 2 * 4 * 5" hast, meinst du "multiplizieren 2 4 5"? –

+2

Der Haskell-Bericht gibt nicht an, was passiert, wenn 'miltiply' zwei Argumente erhält. Es könnte sehr wohl eine Reduktion mit zwei Argumenten geben, aber ich kenne keine Implementierung (von vollem Haskell), die das tut. – augustss

Antwort

2

Man denke nur mathematisch: angenommen, es gibt eine Funktion, die zwei Variablen nimmt: f(x, y). Fix x=2 würden Sie eine neue Funktion mit einer Variablen: g(y)=f(2, y)

Wenn f(x, y) = max(x, y), die das Maximum von x und y gibt, g(y) = f(2, y) = max(2, y) gibt das Maximum von 2 und y.

Für f(x, y, z) = x * y * z, g(y, z) = f(2, y, z) = 2 * y * z und h(z) = g(4, z) = f(2, 4, z) = 2 * 4 * z.

Sie können auch x = 2 und z = 4 zu p(y) = f(2, y, 4) fixieren. In Haskell ist es

\y -> multiply 2 y 4 

Für die Implementierung würde Haskell nicht wirklich 2 multiplizieren und 4, weil sie faul ausgewertet ist. Das heißt, es würde keinen Wert berechnen, bis es sein muss.