我想知道是否可以使用带有多个参数的函数来执行函数式合成。我希望能够做这样的事情
x = (+3).(*)
将x设置为等于将两个数字的乘积加3的函数。
答案 0 :(得分:23)
有多种方法可以做到这一点,但它们都有些尴尬。
((+3).) . (*)
≡ fmap (+3) . (*)
≡ curry $ (+3) . uncurry (*)
≡ \l r -> l*r + 3
哦,等等,这是签名,其中也有一个紧凑的定义,猜猜它叫什么......
((.).(.)) (+3) (*)
我认为最明确的lambda解决方案在这里是最好的。
通常在本地作为一个(或两个)-liner进行的操作是将此组合定义为自定义中缀:
(.:) :: (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
(预先编写正确的函数来两个参数的中缀),存在a widely-used standard implementation。
答案 1 :(得分:3)
是的,我会使用这样的东西:
http://hackage.haskell.org/packages/archive/composition/latest/doc/html/Data-Composition.html
答案 2 :(得分:2)
你也可以使用Data.Aviary.Birds中的B1或黑鸟组合子。我认为对于实际工作,我会使用lambda。