Punktoperator in Haskell
Ich versuche zu verstehen, was der Punktoperator in diesem Haskell-Code tut:
sumEuler = sum . (map euler) . mkList
Kurze Antwort
Äquivalenter Code ohne Punkte, das ist gerecht
sumEuler = \x -> sum ((map euler) (mkList x))
oder ohne das Lambda
sumEuler x = sum ((map euler) (mkList x))
weil der Punkt (.) die Funktionszusammensetzung anzeigt.
Längere Antwort
Lassen Sie uns zuerst die partielle Anwendung vereinfachen euler
zu map
:
map_euler = map euler
sumEuler = sum . map_euler . mkList
Jetzt haben wir nur noch die Punkte. Was wird durch diese Punkte angezeigt?
Aus der Quelle :
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
Somit (.)
ist der Compose-Operator .
Komponieren
In der Mathematik könnten wir die Zusammensetzung der Funktionen f (x) und g (x), dh f (g (x)), als schreiben
(f ∘ g) (x)
was gelesen werden kann "f zusammengesetzt mit g".
In Haskell kann also f ∘ g oder f mit g zusammengesetzt geschrieben werden:
f . g
Die Komposition ist assoziativ, was bedeutet, dass f (g (h (x))), geschrieben mit dem Kompositionsoperator, die Klammern ohne Mehrdeutigkeit weglassen kann.
Das heißt, da (f ∘ g) ∘ h äquivalent zu f ∘ (g ∘ h) ist, können wir einfach f ∘ g ∘ h schreiben.
Zurück kreisen
Zurück zu unserer früheren Vereinfachung:
sumEuler = sum . map_euler . mkList
bedeutet nur, dass sumEuler
es sich um eine nicht angewendete Zusammensetzung dieser Funktionen handelt:
sumEuler = \x -> sum (map_euler (mkList x))