Путаница в отношении композиции функций в Haskell

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

5
задан Will Ness 22 October 2013 в 10:53
поделиться