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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top