Рассмотрите следующее определение функции в ghci.Путаница о функциональном составе в Haskell
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
тип (.) Свидетельствует о том, что не должно быть проблемой со следующей формы, так как сумма «у» является также функцией (это нет? После того, как все- все функции в Haskell?)
let myF y = sin . cos . sum y -- this should work?
что более интересно, что я могу заставить его работать с двумя (или много) аргументов (думаю прохождения списка [3.14, 3.14], как два аргумента х и у), Я должен написать следующие
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. Прочитав эту статью, я подозреваю, что эта форма отличается от состава двух лямбда-выражений. Я смущаюсь, когда пытаюсь провести линию, разделяющую оба эти стиля.
Неверно, что «все функции в Haskell». Конал Эллиот [большое обсуждение этого в своем блоге] (http://conal.net/blog/posts/everything-is-a-function-in-haskell). –