2014-09-15 7 views
5

Ich versuche Curry zu verstehen, indem ich verschiedene Blogs lese und über Flow-Antworten staple und ich glaube, ich habe was verstanden. In Haskell ist jede Funktion curried, es bedeutet, wenn Sie eine Funktion haben wie
f x y = x + y
wirklich
((f x) y)
dabei ist, zunächst die Funktion des ersten Parameters nehmen ‚x‘ als Parameter und wendet sie teilweise funktionieren f welches wiederum eine Funktion für y zurückgibt. wo es nur einen einzigen Parameter braucht und die Funktion anwendet. In beiden Fällen nimmt die Funktion nur einen Parameter an, und auch der Prozess, eine Funktion auf einzelne Parameter zu reduzieren, wird als "currying" bezeichnet. Korrigiere mich, wenn mein Verständnis hier falsch ist.
Also, wenn es korrekt ist, könnten Sie mir bitte sagen, ob die Funktionen "zwei" und "drei" curried Funktionen sind?
Ist der folgende Code wirklich in Haskell currying?

three x y z = x + y + z 
two = three 1 
same = two 1 

In diesem Fall habe ich zwei spezielle Funktionen, ‚zwei‘ und ‚gleiche‘, die so nur einen Parameter zu übernehmen reduziert werden, wird es curried?

+2

Sie können es selbst testen, indem Sie den Befehl ': t' in GHCi verwenden (': t three' zeigt den Typ von 'three' an). – Mephy

+0

groß, wusste das nicht. Vielen Dank. – Nair

+0

@JoshuaHannah - vielleicht sehen Sie das hier. Ich war sicher nicht beleidigt oder für Sie, um Ihre Antwort zu löschen - Ich hoffte nur, Sie würden ein wenig nützliche Informationen für Nair hinzufügen - Entschuldigung Mann – Carsten

Antwort

4

Schauen wir zuerst two. Es hat eine Unterschrift von

two :: Num a => a -> a -> a 

die Num a jetzt vergessen (es ist nur eine Einschränkung a - können Sie Int hier lesen). Sicherlich ist dies auch eine Curry-Funktion.

Der nächste ist mehr interessant:

same :: Num a => a -> a 

(btw: schöner Name - es ist die gleiche aber nicht genau id ^^)

TBH: I don Ich weiß es nicht genau.

Die beste Definition, die ich von einer curried Funktion kennen, ist dies:

A curried Funktion eine Funktion von N Argumente ist eine weitere Funktion von (N-1) Argumente zurück.

(wenn Sie möchten, können Sie diesen Umfang voll curried Funktionen natürlich)

Dies wird nur passen, wenn Sie Konstanten als Funktionen mit 0 Parametern definieren - die Sie sicher können. Also ich würde sagen ja (?) Auch das ist eine curried Funktion, sondern nur in einem mathy Borderline-Weg (wie die Summe von 0 Zahlen ist definiert sein 0)

1

Sie, dass three einfiel Funktion mit anonymen Funktionen ist:

three = \x -> (\y -> (\z -> x + y + z))) 
4

Am besten nur darüber gleichsinnig denken.Die folgenden sind alle äquivalente Definitionen:

f x  y  z = x+y+z 
f x  y = \z -> x+y+z 
f x = \y -> (\z -> x+y+z) 
f = \x -> (\y -> (\z -> x+y+z)) 

Die Teilanwendung ist hier nur tangential relevant. Meistens möchten Sie nicht, dass die eigentliche Teilapplikation ausgeführt wird und das tatsächliche Lambda-Objekt im Speicher erzeugt wird - in der Hoffnung, dass der Compiler dies tut - und besser optimieren - die vollständige Definition am letzten Punkt der vollständigen Anwendung. Das Vorhandensein der Funktionen curry/uncurry ist ein weiteres verwirrendes Problem. Sowohl f (x,y) = ... und f x y = ... sind in Haskell Curry, natürlich, aber in unseren Köpfen wir neigen dazu, denken über die erste als Funktion zweier Argumente, so übersetzen die Funktionen zwischen den beiden Formen sind benannt curry und uncurry, als Gedächtnisstütze.