Haskell Art Unterschrift Frage
-
28-09-2019 - |
Frage
Kann jemand mir erklären, warum tun diese Funktionen hat unterschiedliche Anzahl von Argumenten und Verhalten , aber gleiche Art Signatur , aber sie sind beide richtig?
comp1 :: (a -> b) -> (b -> c) -> a -> c
comp1 f g = g.f
comp2 :: (a -> b) -> (b -> c) -> a -> c
comp2 f g x = g (f x)
auch, warum tut comp2 hat
comp2 :: (a -> b) -> (b -> c) -> a -> c
anstelle von etwas wie
comp2 :: a -> (a -> b) -> (b -> c) -> a -> c
Danke.
Lösung
comp2 f g x = g (f x)
ist syntaktischer Zucker für
comp2 = \f -> \g -> \x -> g (f x)
In ähnlicher
comp1 f g = g.f
ist Zucker für
comp1 = \f -> \g -> g.f
Die Definition von .
ist:
f1 . f2 = \x -> f1 (f2 x) -- Names of arguments have been changed to avoid confusion
Also, wenn wir die Definition in die entzuckert Form comp1
einsetzen, erhalten wir:
comp1 = \f -> \g -> \x -> g (f x)
Das ist genau das gleiche wie die entzuckert Form comp2
, so klar die Definitionen äquivalent sind.
Andere Tipps
comp1 f g = g.f
geschrieben in Punkt frei Stil (nicht Bezug um Punkte, sondern auf Werte ). Wenn Sie comp1
nennen, gibt es implizit einen dritten Parameter zu g.f
geleitet wird, die die Zusammensetzung der beiden Funktionen g
und f
ist: (g.f) x
g (f x)
gleich, das heißt g
ist das Ergebnis der f x
geben. Kein Parameter x
existiert in comp1
, weil sie implizit an die Funktion übergeben wird. (Man könnte denken comp1
als teilweise angewendet oder curried Funktion, wenn es macht Sie sich besser fühlen.)
comp2
der Typ fragt nach zwei Funktionen, eine von (a->b)
und anderen (b->c)
sowie einen Parameter vom Typ a
. Es besteht keine Notwendigkeit, eine a ->
in seiner Unterschrift zu setzen.
Die beiden Funktionen sind wirklich gleichwertig sind; man verwendet einfach einige Haskell Tricks prägnanter zu sein.
Currying . Eine Mehrargumentfunktion in ML und Haskell, ist nur syntaktischer Zucker für eine Ein-Argumentfunktion, dass eine Funktion zurückkehrt; die Funktion, dass er zurückkehrt nimmt die restlichen Argumente.