javascript - 写一个一元函数链接器,在 codewars 上出现 TypeError 但在 repl.it 上没有错误?

标签 javascript functional-programming chaining declarative-programming

我在 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/

相关文章:

javascript - 在 Javascript 或 HTML5 中尝试两个无需用户交互的下载链接

node.js - 如何运行 promise

c# - 使用点表示法在函数中封装和使用 LINQ 逻辑

rust - 如何在 read_to_string 更改为占用缓冲区后创建链接 API?

javascript - 如何在 D3.js 中将矩形居中?

javascript - 新窗口对象和链接单击之间的竞争条件

javascript - 将 Javascript 变量发送到 php 页面

java - Ruby 字符串到日期时间格式

python - 有人可以向我解释函数对象和闭包之间的区别吗

scala - 状态 monad - 调整仅适用于部分状态的功能?