如何将g(f(x)(y))转换为Point-free形式?(JavaScript Ramda环境)
可以将
g(f(x)(y)) 转换为Point-free形式,结合Ramda库有几种常见实现方式: 方式一:利用函数Functor的map
Ramda中函数属于Functor,R.map(g, fn)等价于R.compose(g, fn)。对于柯里化函数f来说,f(x)返回一个接受y的函数,我们可以通过R.map(g)把g组合到这个返回函数上:
const pointfreeFn = R.compose(R.map(g), f);
测试示例:
const f = x => y => x + y; const g = z => z * 2; const pointfreeFn = R.compose(R.map(g), f); pointfreeFn(1)(2); // 输出6,等价于g(f(1)(2))
方式二:利用converge和unapply
通过R.unapply将参数转为数组,再用R.converge分别处理两个参数,最后通过R.call执行f(x)(y):
const pointfreeFn = R.compose( g, R.converge(R.call, [ R.compose(f, R.head), R.last ]), R.unapply(R.identity) );
解释:
R.unapply(R.identity)把输入的x、y打包成数组[x, y]R.converge(R.call, ...)分别取数组头部(x)传给f得到f(x),取数组尾部(y),然后用R.call(f(x), y)得到f(x)(y)- 最后将结果传给
g
方式三:利用uncurryN转换函数形式
如果f是柯里化的二元函数,先用R.uncurryN(2, f)将其转为接受两个参数的非柯里化函数,再和g组合:
const pointfreeFn = R.compose(g, R.uncurryN(2, f));
测试示例:
const f = x => y => x * y; const g = z => z + 5; const pointfreeFn = R.compose(g, R.uncurryN(2, f)); pointfreeFn(3, 4); // 输出17,等价于g(f(3)(4))
需要注意的是,方式一返回的是柯里化的函数(接受x后返回接受y的函数),而方式三可以接受两个参数一次性传入,具体选择取决于你的调用场景。
内容的提问来源于stack exchange,提问作者jramm
相关产品推荐
相关产品推荐

