Функциональная композиция с многозначными функциями в haskell?

Мне было интересно, можно ли сделать функциональную композицию с функциями, которые принимают более одного аргумента. Я хочу иметь возможность сделать что-то вроде этого

x = (+3).(*)

установив x равным функции, которая прибавляет три к произведению двух чисел.


person MYV    schedule 02.06.2013    source источник
comment
conal.net/blog/posts/semantic-editor-combinators   -  person luqui    schedule 03.06.2013
comment
Это может быть тем, что вы ищете.   -  person is7s    schedule 03.06.2013


Ответы (3)


Есть несколько способов сделать это, но все они несколько неуклюжи.

((+3).) . (*)
≡ fmap (+3) . (*)
≡ curry $ (+3) . uncurry (*)
≡ \l r -> l*r + 3

О, подождите, это была подпись, где еще есть компактное определение, угадайте, как это называется...

((.).(.)) (+3) (*)

Я бы сказал, что лямбда-решение, будучи наиболее явным, здесь скорее лучшее.

Что помогает и часто делается только локально в виде одной (или двух) строк, так это определить эту композицию как пользовательский инфикс:

(.:) :: (c->d) -> (a->b->c) -> a->b->d
f .: i = \l r -> f $ i l r

Что позволяет писать просто (+3) .: (*).

Кстати, для аналогичного (b->b->c) -> (a->b) -> a->a->c (предварительно скомпонуйте правильную функцию для обоих аргументов инфикса) существует широко используемая стандартная реализация.

person leftaroundabout    schedule 02.06.2013
comment
Мне больше всего нравится ((.).(.)), главным образом потому, что мне нравится представлять, что его обнаружил Фрэнки Хауэрд. - person Benjamin Hodgson♦; 03.06.2013
comment
+1 за fmap (самый крутой) и лямбда (тот, который я бы хотел использовать в любой кодовой базе, над которой работал!) - person monk; 03.06.2013
comment
да - возьмите лямбду или лучше дайте имя функции - честно говоря: другие решения интеллектуальны, но более или менее нечитаемы (вы можете легко открыть их заново, правда, но я бы сказал, что они нечитаемы) - такие вещи делают Haskell загадочным черным деревом ярлык "башня", который отпугивает так много хороших разработчиков от изучения Haskell - person Random Dev; 03.06.2013
comment
Существует ли обычное англоязычное название для (.).(.)? - person Boyd Stephen Smith Jr.; 13.06.2013
comment
@BoydStephenSmithJr.: да. - person leftaroundabout; 14.06.2013
comment
@leftaroundabout Как это зовут? - person Boyd Stephen Smith Jr.; 24.06.2013
comment
((.).(.)) просто обманывает меня, я полностью понимаю (.), но я не могу понять ((.).(.)), думаю, я собираюсь использовать ручку и бумагу, чтобы понять это . - person Luc DUZAN; 03.04.2014

Да, я бы использовал что-то вроде этого:

http://hackage.haskell.org/packages/archive/composition/latest/doc/html/Data-Composition.html

person Tom Ellis    schedule 03.06.2013

Вы также можете использовать комбинатор B1 или blackbird из Данные.Вольер.Птицы. Я думаю, что для реальной работы я бы использовал лямбду.

person jk.    schedule 03.06.2013