是否存在通过其他函数调用带参数的函数的惯用的无点方法

时间:2015-08-23 10:19:08

标签: haskell pointfree

我们有这些功能

foo x1 x2 ... xN =

f1 x =
f2 x =
...
fN x = 

这个函数是否有惯用的无点版本?

bar x1 x2 ... xn = foo (f1 x1) (f2 x2) ... (fN xN)

修改

如果不能,我们可以某种方式将此函数推广到N个参数吗?

applyF3 f f1 f2 f3 x1 x2 x3 = f (f1 x1) (f2 x2) (f3 x3)
bar = applyF3 foo f1 f2 f3

3 个答案:

答案 0 :(得分:6)

不是真正的惯用语:

import Control.Arrow

bar = curry . curry $ (f1 *** f2) *** f3 >>> (uncurry . uncurry $ foo)

为更多参数添加更多curry/uncurry

有点版本更清晰。

答案 1 :(得分:1)

如果我们有这套功能

uncurryPairsN f (x1,(x2,...)) =  f x1 x2 ... xN
curryPairsN f x1 x2 ... xN =  f (x1, (x2, ...))

然后

bar = curryPairsN $ uncurryPairsN foo . (f1 *** f2 *** ... *** fN)

答案 2 :(得分:0)

你可以使用包中的Data.Function.Pointless无意义的乐趣:

如果你有

bar x1 x2 x3 = foo (f1 x1) (f2 x2) (f3 x3)

你可以把它变成毫无意义的重构

bar = foo ~> f1 ~> f2 ~> f3 ~> id

工作原理在blog post

中描述