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