Haskell 是否有惯用的无点方式通过另一个函数调用带有参数的函数

Haskell 是否有惯用的无点方式通过另一个函数调用带有参数的函数,haskell,pointfree,Haskell,Pointfree,我们有这些功能 foo x1 x2 ... xN = f1 x = f2 x = ... fN x = uncurryPairsN f (x1,(x2,...)) = f x1 x2 ... xN curryPairsN f x1 x2 ... xN = f (x1, (x2, ...)) 这个函数是否有惯用的无点版本 bar x1 x2 ... xn = foo (f1 x1) (f2 x2) ... (fN xN) 编辑 如果不是,我们能把这个函数推广到N个参数吗 applyF

我们有这些功能

foo x1 x2 ... xN =

f1 x =
f2 x =
...
fN x = 
uncurryPairsN f (x1,(x2,...)) =  f x1 x2 ... xN
curryPairsN f x1 x2 ... xN =  f (x1, (x2, ...))
这个函数是否有惯用的无点版本

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
s以获取更多参数


有意义的版本更清晰。

如果我们有这组函数

foo x1 x2 ... xN =

f1 x =
f2 x =
...
fN x = 
uncurryPairsN f (x1,(x2,...)) =  f x1 x2 ... xN
curryPairsN f x1 x2 ... xN =  f (x1, (x2, ...))
然后

您可以从软件包中使用无意义的乐趣:

如果你有

条x1x2x3=foo(f1-x1)(f2-x2)(f3-x3)

您可以将其转化为无意义的重构

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


工作在a中描述。

我认为您建议的有意义的版本与它得到的一样惯用。对于
n=5
,您会得到如下结果:
bar=flip f5。(翻)翻。翻转f4。(翻转)。翻转f3。((.) .) . (.f2)。福。f1
…是的,尽管有了N元版本的curry/uncurry,就像我们为(例如)zipWith和liftM所做的那样,这一点相当清楚:
bar=curry4$uncurry4 foo。(f1***f2***f3***f4)
@amalloy我认为以curryN uncurryN实现为例,您应该发布curryN$uncurryN foo。(f1***f2***……***fN)作为答案。@amalloy确实如此。我在hackage上查找了它们,但令人惊讶的是,它们不在任何包中。当然,它们很容易定义,但我想坚持使用可用的组合符。也不要忘记,
uncurryN
将产生(我假设)一个N元组,它与
f1***…***fN
不兼容,后者需要嵌套对。@chi我认为这个函数应该有不同的名称,比如curryPairs uncurryPairs