13

我想知道是否可以使用带有多个参数的函数进行函数组合。我希望能够做这样的事情

x = (+3).(*)

将 x 设置为将两个数字的乘积相加的函数。

4

3 回答 3

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参数预先组合正确的函数),存在一个广泛使用的标准实现

于 2013-06-02T23:31:32.400 回答
3

是的,我会使用这样的东西:

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

于 2013-06-03T10:13:55.273 回答
2

您还可以使用Data.Aviary.Birds中的 B1 或 blackbird 组合器。我认为对于实际工作,我会使用 lambda。

于 2013-06-03T10:20:42.767 回答