Композиция родовых функций в Хаскеле
Я читал здесь и заметил, что, например, если у меня есть следующие определения функций:
a :: Integer->Integer->Integer
b :: Integer->Bool
Следующее выражение недопустимо:
(b . a) 2 3
Довольно странно, что функции композиции должны иметь только один параметр.
Это ограничение, потому что есть какая-то проблема в определении наиболее общего в Haskell или есть какая-то другая причина?
Я новичок в Хаскеле, поэтому я задаю, возможно, бесполезные вопросы.
1 ответ
Решение
Когда вы делаете a 2 3
Вы не подаете заявку a
до 2 аргументов. Вы на самом деле подаете заявку a
к единственному аргументу, приводящему к функции, затем возьмите эту функцию и примените ее к 3. Таким образом, вы фактически делаете 2 приложения. Таким образом, в некотором смысле, то, что у вас есть, не эквивалентно этому:
a :: (Integer, Integer) -> Integer
b :: Integer -> Integer
(b . a) (2, 3)
Вы могли бы сделать это, кстати
(b . a 2) 3