Оператор композиции функций Haskell типа (c → d) → (a → b → c) → (a → b → d)

Обычная композиция функций имеет тип

(.) :: (b -> c) -> (a -> b) -> a -> c

Я полагаю, это должно быть обобщено на такие типы, как:

(.) :: (c -> d) -> (a -> b -> c) -> a -> b -> d

Конкретный пример: вычисление квадрата разницы. Мы могли бы написать diffsq ab = (a - b) ^ 2 , но кажется, что я смогу составить (-) и (^ 2) , чтобы написать что-то вроде diffsq = (^ 2). (-) .

Я, конечно, не могу. Одна вещь, которую я могу сделать, - это использовать кортеж вместо двух аргументов (-) , преобразовав его с помощью uncurry , но это не то же самое.

Можно ли делать то, что я хочу? Если нет, то что я неправильно понимаю, что заставляет меня думать, что это возможно?


Примечание: Фактически, об этом уже спрашивали здесь , но ответ (который, как я подозреваю, должен существовать) не был дано.

39
задан Community 23 May 2017 в 12:26
поделиться