Рассмотрим следующее определение функции в ghci.
let myF = sin . cos . sum
где. обозначает композицию двух функций (справа ассоциативно). Это я могу назвать
myF [3.14, 3.14]
и это дает мне желаемый результат. По-видимому, он передает список [3.14, 3.14] в функцию 'sum', а его 'результат' передается в cos и так далее и так далее. Однако, если я сделаю это в интерпретаторе
let myF y = sin . cos . sum y
или
let myF y = sin . cos (sum y)
тогда у меня возникают проблемы. Изменение этого в следующее дает мне желаемый результат.
let myF y = sin . cos $ sum y
или
let myF y = sin . cos . sum $ y
Тип (.) Говорит о том, что не должно быть проблем со следующей формой, поскольку 'sum y' также является функцией (не так ли? Ведь в Haskell все есть функция?)
let myF y = sin . cos . sum y -- this should work?
Что более интересно, я могу заставить его работать с двумя (или многими) аргументами (представьте, что список рассылки [3.14, 3.14] является двумя аргументами x и y), я должен написать следующее
let (myF x) y = (sin . cos . (+ x)) y
myF 3.14 3.14 -- it works!
let myF = sin . cos . (+)
myF 3.14 3.14 -- -- Doesn't work!
На HaskellWiki обсуждается эта форма, которую они называют «PointFree» http://www.haskell.org/haskellwiki/Pointfree. Читая эту статью, я подозреваю, что эта форма отличается от композиции двух лямбда-выражений. Я запутываюсь, когда пытаюсь нарисовать линию, разделяющую оба эти стиля.