вопрос подписи типа haskell - PullRequest
       18

вопрос подписи типа haskell

1 голос
/ 25 ноября 2010

Может кто-нибудь объяснить мне, почему эти функции иметь различное количество аргументов и поведения , но подпись того же типа , но они оба правильные?

comp1 :: (a -> b) -> (b -> c) -> a -> c
comp1 f g = g.f

comp2 :: (a -> b) -> (b -> c) -> a -> c
comp2 f g x = g (f x)

также, почему comp2 имеет

comp2 :: (a -> b) -> (b -> c) -> a -> c

вместо чего-то вроде

comp2 :: a -> (a -> b) -> (b -> c) -> a -> c

Спасибо.

Ответы [ 3 ]

4 голосов
/ 25 ноября 2010
comp2 f g x = g (f x)

является синтаксическим сахаром для

comp2 = \f -> \g -> \x -> g (f x)

Аналогично

comp1 f g = g.f

является сахаром для

comp1 = \f -> \g -> g.f

Определение .:

f1 . f2 = \x -> f1 (f2 x) -- Names of arguments have been changed to avoid confusion

Таким образом, если мы вставим определение в десагаредную форму comp1, мы получим:

comp1 = \f -> \g -> \x -> g (f x)

Это в точности то же самое, что и десугардовая форма comp2, поэтому ясно, что определения эквивалентны.

4 голосов
/ 25 ноября 2010

comp1 f g = g.f записывается в стиле без точек (относится не к точкам, а к значениям ).Когда вы вызываете comp1, третий параметр неявно передается в g.f, который является композицией двух функций g и f: (g.f) x равно g (f x), т.е. передается gрезультат f xcomp1 не существует параметра x, поскольку он неявно передается функции.(Вы можете думать о comp1 как о частично примененной или карри функции, если вам от этого становится лучше.)

comp2 Тип просит двафункции, одна из (a->b) и другая (b->c), а также параметр типа a.Нет необходимости ставить a -> в его подписи.

Эти две функции действительно эквивалентны;Для того, чтобы быть более лаконичным, просто нужно использовать несколько приемов на Haskell.

1 голос
/ 27 ноября 2010

Карринг . Функция с несколькими аргументами в ML и Haskell является просто синтаксическим сахаром для функции с одним аргументом, которая возвращает функцию; возвращаемая функция принимает оставшиеся аргументы.

...