我们有这些功能
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
答案 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。
中描述