Functional composition with multi-valued functions in haskell?

前端 未结 3 972
太阳男子
太阳男子 2020-12-06 16:53

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

         


        
相关标签:
3条回答
  • 2020-12-06 17:25

    There are multiple ways to do it, but they're all somewhat awkward.

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

    Oh, wait, this was the signature where there's also a compact definition, guess what it's called...

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

    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:

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

    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.

    0 讨论(0)
  • 2020-12-06 17:45

    Yes, I'd use something like this:

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

    0 讨论(0)
  • 2020-12-06 17:46

    You could also use the B1 or blackbird combinator from Data.Aviary.Birds. I think for real work I'd use a lambda though.

    0 讨论(0)
提交回复
热议问题