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