Рассмотрим следующее определение функции в 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 . Читая эту статью, я подозреваю, что эта форма отличается от композиции двух лямбда-выражений. Я сбиваюсь с толку, когда пытаюсь провести линию, разделяющую оба этих стиля.