具有多值函数的函数组合在haskell中?

时间:2013-06-02 23:22:42

标签: haskell pointfree function-composition

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

x = (+3).(*)

将x设置为等于将两个数字的乘积加3的函数。

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)

答案 2 :(得分:2)

你也可以使用Data.Aviary.Birds中的B1或黑鸟组合子。我认为对于实际工作,我会使用lambda。