2016-06-20 15 views
0

In einigen funktionalen Sprachen sind teilweise angewandte Funktionen und Curry-Funktionen zwei ähnliche, aber unterschiedliche Konzepte.Sind die Konzepte der partiellen Anwendung und Curry in Haskell austauschbar?

Das Buch lesen Learn You a Haskell for Great Good, scheint der Autor diese austauschbar anzuwenden.

[Curry-Funktionen] Jede Funktion in Haskell benötigt offiziell nur einen Parameter.

...

wenn wir eine Funktion mit zu wenigen Parametern aufrufen, bekommen wir wieder eine teilweise angewandte Funktion, eine Funktion, was bedeutet, dass so viele Parameter nimmt, wie wir weggelassen.

Meine Frage ist: Sind die Konzepte der partiellen Anwendung und Curry in Haskell austauschbar?

+0

Die ehrliche Antwort ist kurz und es ist ja. – hao

+3

Für mich hat "currying" mit Funktionsdefinition zu tun, während "partielle Anwendung" mit Funktionsaufruf zu tun hat. Sie sind also nicht * genau * austauschbar, aber sie sind die Seiten einer Münze, und beide sind ohne die andere nicht sinnvoll. Wenn Sie sagen, dass sie in einigen funktionalen Sprachen "ähnlich, aber verschieden" sind, worauf beziehen Sie sich dann? – ruakh

+0

Es ist auch interessant zu bemerken, dass, während das System vom * Typ * ausschließlich in Curry-unären Funktionen handelt, Funktionen im generierten GHC-Code * mehrere Argumente haben; Schließungen werden nur für teilweise angewandte Funktionen zugewiesen. Dies ist möglich, weil der Code unter der Curriculum-Interpretation, die * isomorph * zur unverfälschten Interpretation ist, typengeprüft wurde, dh es handelt sich um eine typerhaltende Optimierung. –

Antwort

4

Sie sind verschiedene, aber verwandte Konzepte. Da Funktionsdefinitionen curiert sind, wenn Sie eine Funktion teilweise anwenden (dh sie mit weniger Argumenten aufrufen als erwartet), erhalten Sie eine andere Funktion zurück, die weniger Argumente erwartet.

Der Prozess des currying ist eine N-ary-Funktion mit N "Schichten" von unären Funktionen ersetzt, so dass man sich teilweise anwenden kann,

Drehen
function(x,y) {return x+y;} 

in

function(x) {return function(y) {return x+y;};} 

Das currying ist Teil der Definition der Funktion, und partielle Anwendung ist, was Sie mit einer Funktion tun, wenn Sie es aufrufen.