是否有惯用的 pointfree 方法通过另一个函数调用带有参数的函数

Is there idiomatic pointfree way to call a function with arguments through another functions

我们有这些功能

foo x1 x2 ... xN =

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

这个函数有惯用的 pointfree 版本吗?

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

不是很地道:

import Control.Arrow

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

添加更多 curry/uncurry 以获得更多参数。

有针对性的版本更清楚。

如果我们有这组函数

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

然后

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

您可以使用软件包 pointless-fun:

中的 Data.Function.Pointless

如果你有

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

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

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

工作原理在 blog post 中进行了描述。