Operator kropki w Haskell
Próbuję zrozumieć, co robi operator kropki w tym kodzie Haskella:
sumEuler = sum . (map euler) . mkList
Krótka odpowiedź
To znaczy równoważny kod bez kropek
sumEuler = \x -> sum ((map euler) (mkList x))
lub bez lambda
sumEuler x = sum ((map euler) (mkList x))
ponieważ kropka (.) wskazuje skład funkcji.
Dłuższa odpowiedź
Najpierw uprośćmy częściowe zastosowanie funkcji euler
do map
:
map_euler = map euler
sumEuler = sum . map_euler . mkList
Teraz mamy tylko kropki. Na co wskazują te kropki?
Ze źródła :
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
Tak (.)
jest z operatorem tworzenia .
Komponować
W matematyce moglibyśmy zapisać skład funkcji, f (x) i g (x), czyli f (g (x)), jako
(f ∘ g) (x)
które można odczytać jako „f składa się z g”.
Zatem w Haskell f ∘ g lub f złożone z g można zapisać:
f . g
Kompozycja jest asocjacyjna, co oznacza, że f (g (h (x))), napisane operatorem kompozycji, może pomijać nawiasy bez żadnej dwuznaczności.
To znaczy, ponieważ (f ∘ g) ∘ h jest równoważne f ∘ (g ∘ h), możemy po prostu napisać f ∘ g ∘ h.
Wracając
Wracając do naszego wcześniejszego uproszczenia, to:
sumEuler = sum . map_euler . mkList
oznacza po prostu, że sumEuler
jest to niezastosowana kompozycja tych funkcji:
sumEuler = \x -> sum (map_euler (mkList x))