Оператор точки в Haskell
Я пытаюсь понять, что делает оператор точка в этом коде Haskell:
sumEuler = sum . (map euler) . mkList
Короткий ответ
Эквивалентный код без точек, это просто
sumEuler = \x -> sum ((map euler) (mkList x))
или без лямбды
sumEuler x = sum ((map euler) (mkList x))
потому что точка (.) указывает на композицию функции.
Более длинный ответ
Во-первых, давайте упростим частичное применение euler
к map
:
map_euler = map euler
sumEuler = sum . map_euler . mkList
Теперь у нас есть только точки. Что обозначено этими точками?
Из источника :
(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g = \x -> f (g x)
Таким образом , (.)
является Сотроз оператором .
Сочинять
В математике мы могли бы записать композицию функций f (x) и g (x), то есть f (g (x)), как
(е ∘ г) (х)
что можно читать как «f, составленная с g».
Итак, в Haskell f ∘ g или f, составленный с g, можно записать:
f . g
Композиция ассоциативна, что означает, что f (g (h (x))), записанная с помощью оператора композиции, может опускать скобки без какой-либо двусмысленности.
То есть, поскольку (f ∘ g) ∘ h эквивалентно f ∘ (g ∘ h), мы можем просто написать f ∘ g ∘ h.
Кружу назад
Возвращаясь к нашему предыдущему упрощению, это:
sumEuler = sum . map_euler . mkList
просто означает, что sumEuler
это непримененная композиция этих функций:
sumEuler = \x -> sum (map_euler (mkList x))