Композиция родовых функций в Хаскеле - PullRequest
6 голосов
/ 29 декабря 2010

Я читал здесь и заметил, что, например, если у меня есть следующие определения функций:

a :: Integer->Integer->Integer
b :: Integer->Bool

Следующее выражение неверно :

(b . a) 2 3

Довольно странно, что функции композиции должны иметь только один параметр.

Является ли это ограничением из-за некоторой проблемы в определении наиболее общего в Хаскеле или по какой-то другой причине?

Я новичок в Haskell, поэтому я задаю, возможно, бесполезные вопросы.

1 Ответ

7 голосов
/ 29 декабря 2010

Когда вы делаете a 2 3, вы не применяете a к 2 аргументам.Вы фактически применяете a к его единственному аргументу, в результате чего получается функция, затем берете эту функцию и применяете ее к 3. Таким образом, вы фактически делаете 2 приложения.Таким образом, в некотором смысле, то, что вы имеете, не эквивалентно этому:

a :: (Integer, Integer) -> Integer
b :: Integer -> Integer
(b . a) (2, 3)

Вы могли бы сделать это, кстати

(b . a 2) 3
...