Обычная композиция функций имеет тип
(.) :: (b -> c) -> (a -> b) -> a -> c
Я полагаю, это должно быть обобщено на такие типы, как:
(.) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
Конкретный пример: вычисление квадрата разницы. Мы могли бы написать diffsq ab = (a - b) ^ 2
, но кажется, что я смогу составить (-)
и (^ 2)
, чтобы написать что-то вроде diffsq = (^ 2). (-)
.
Я, конечно, не могу. Одна вещь, которую я могу сделать, - это использовать кортеж вместо двух аргументов (-)
, преобразовав его с помощью uncurry
, но это не то же самое.
Можно ли делать то, что я хочу? Если нет, то что я неправильно понимаю, что заставляет меня думать, что это возможно?
Примечание: Фактически, об этом уже спрашивали здесь , но ответ (который, как я подозреваю, должен существовать) не был дано.