Есть несколько способов сделать это, но все они несколько неуклюжи.
((+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