我想实现一个箭头功能,该功能等效于另一个正常功能,如下例所示:
f(h)(a1)(a2)...(an)
的工作方式类似于h(a1, a2, ..., an)
。
我认为我必须使用以下伪代码来实现它,但是我不知道如何找出h函数参数的数量?
伪代码:
function h (...varArgs) {
}
var f = (h) => {
return ...
}
答案 0 :(得分:1)
单线:
let curry = fn => (fn.length < 2) ? fn : x => curry(fn.bind(0, x))
//
let h = (a, b, c) => a + '/' + b + '/' + c
console.log(curry(h)(1)(2)(3))
读取:“如果arity(参数数量)为0或1,则curry f = f,否则创建一个带有一个参数的函数,该函数调用输入函数的咖喱版本,其中第一个参数固定在闭包中。 / p>
当然,如果未知数(fn.length
)不起作用,则此方法将无效。要处理真正的可变参数函数,唯一的选择是在咖喱函数中添加一个to-value方法(toString/valueOf
),以便它可能在 some 中工作上下文:
let curryVar = fn => x => {
let b = fn.bind(0, x), f = curryVar(b)
f.toString = b
return f
}
let hv = (...xs) => xs.join('|')
console.log(curryVar(hv)(1)(2)(3) + "!")