我在 code wars 上研究了这个问题一段时间,并使用 repl.it 对其进行了测试。这是一个简单的一元函数链接器,但它只适用于 repl.it,而 codewars 在给出这段代码时会给我一个 TypeError:
function chained(functions) {
var funcs = Array.prototype.slice.call(arguments);
return function (value){
var finalValue = funcs.reduce(function(prevVal, currFunc){
return currFunc(prevVal);
}, value);
return finalValue;
}
}
它告诉我 currFunc 不是一个函数,但是使用下面的测试代码我在 repl.it 中运行时得到了正确的答案:
function f1(x){ return x*2 }
function f2(x){ return x+2 }
function f3(x){ return Math.pow(x,2) }
console.log(chained(f1,f2,f3)(0));
为什么它不是 codewars 中的函数?
最佳答案
我不得不查找有关 codewars 的测试。他们给你这个样板...
function chained(functions) {
//FIXME
}
查看测试,您可以看到函数正在数组中传递...
Test.assertEquals( chained(<b>[f1,f2,f3]</b>)(0), 4 )
Test.assertEquals( chained(<b>[f1,f2,f3]</b>)(2), 36 )
Test.assertEquals( chained(<b>[f3,f2,f1]</b>)(2), 12 )
你犯的错误是...
var funcs = Array.prototype.slice.call(arguments);
...只有在 chained
被这样调用时才有效...
chained(f1,f2,f3)
您的代码可以正常工作并通过 codewars 的所有测试。这是彻底的改变......
function chained(functions) {
<del>var funcs = Array.prototype.slice.call(arguments);</del>
return function (value){
var finalValue = <del>funcs</del><b>functions</b>.reduce(function(prevVal, currFunc){
return currFunc(prevVal);
}, value);
return finalValue;
}
}
最后,这是我的解决方案^_^
const id = x => x;
const uncurry = f => (x,y) => f (x) (y);
const rcomp = f => g => x => g (f (x));
const chained = fs => fs.reduce(uncurry(rcomp), id);
关于javascript - 写一个一元函数链接器,在 codewars 上出现 TypeError 但在 repl.it 上没有错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39911915/