Композиция родовых функций в Хаскеле

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

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
Другие вопросы по тегам