Operatore punto in Haskell
Sto cercando di capire cosa sta facendo l'operatore punto in questo codice Haskell:
sumEuler = sum . (map euler) . mkList
Risposta breve
Codice equivalente senza punti, questo è giusto
sumEuler = \x -> sum ((map euler) (mkList x))
o senza lambda
sumEuler x = sum ((map euler) (mkList x))
perché il punto (.) indica la composizione della funzione.
Risposta più lunga
Per prima cosa, semplifichiamo l'applicazione parziale di euler
a map
:
map_euler = map euler
sumEuler = sum . map_euler . mkList
Ora abbiamo solo i punti. Cosa è indicato da questi punti?
Dalla fonte :
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
Così (.)
è l' operatore di composizione .
Comporre
In matematica, potremmo scrivere la composizione delle funzioni, f (x) e g (x), cioè f (g (x)), come
(f ∘ g) (x)
che si può leggere "f composta con g".
Quindi in Haskell, f ∘ g, of composto con g, può essere scritto:
f . g
La composizione è associativa, il che significa che f (g (h (x))), scritto con l'operatore di composizione, può tralasciare le parentesi senza alcuna ambiguità.
Cioè, poiché (f ∘ g) ∘ h è equivalente a f ∘ (g ∘ h), possiamo semplicemente scrivere f ∘ g ∘ h.
Tornando indietro
Tornando alla nostra precedente semplificazione, questo:
sumEuler = sum . map_euler . mkList
significa semplicemente che sumEuler
è una composizione non applicata di quelle funzioni:
sumEuler = \x -> sum (map_euler (mkList x))