I was wondering if it was possible to do functional composition with functions that take more than one argument. I want to be able to do something like this
x = (+3).(*)
setting x equal to a function that adds three to the product of two numbers.
You could also use the B1 or blackbird combinator from Data.Aviary.Birds. I think for real work I'd use a lambda though.
Yes, I'd use something like this:
http://hackage.haskell.org/packages/archive/composition/latest/doc/html/Data-Composition.html
There are multiple ways to do it, but they're all somewhat awkward.
Oh, wait, this was the signature where there's also a compact definition, guess what it's called...
I'd argue that the lambda solution, being most explicit, is rather the best here.
What helps, and is often done just locally as a one(or two)-liner, is to define this composition as a custom infix:
Which allows you to write simply
(+3) .: (*)
.BTW, for the similar
(b->b->c) -> (a->b) -> a->a->c
(precompose the right function to both arguments of the infix) there exists a widely-used standard implementation.