Подтвердить что ты не робот

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

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

x = (+3).(*)

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

4b9b3361

Ответ 1

Существует несколько способов сделать это, но все они несколько неудобны.

((+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) .: (*).

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

Ответ 3

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