我想知道是否可以使用带有多个参数的函数进行函数组合。我希望能够做这样的事情
x = (+3).(*)
将 x 设置为将两个数字的乘积相加的函数。
我想知道是否可以使用带有多个参数的函数进行函数组合。我希望能够做这样的事情
x = (+3).(*)
将 x 设置为将两个数字的乘积相加的函数。
有多种方法可以做到这一点,但它们都有些尴尬。
((+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
参数预先组合正确的函数),存在一个广泛使用的标准实现。
是的,我会使用这样的东西:
http://hackage.haskell.org/packages/archive/composition/latest/doc/html/Data-Composition.html
您还可以使用Data.Aviary.Birds中的 B1 或 blackbird 组合器。我认为对于实际工作,我会使用 lambda。