是否有惯用的 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 中进行了描述。
我们有这些功能
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 中进行了描述。