在下面的程序中,前两个日志工作正常。我在第三个和最后一个日志中没有做任何新的事情,但不知何故它在运行时崩溃了。我的脚本中的错误在哪里?我已经多次查看它,它似乎是对它上面经过验证的工作代码的一个相当微不足道的修改。
sumSq = (n) -> ([0..n].map (i) -> i * i).reduce (a, b) -> a + b
sq = (n) -> n * n
sqSum = ((n) -> ([0..n].reduce (a, b) -> a + b))
console.log(sqSum 5)
console.log(sq(sqSum 5))
newSqSum = sq ((n) -> ([0..n].reduce (a, b) -> a + b))
console.log(newSqSum(5))
答案 0 :(得分:0)
这是一个功能,而不是数字:
(n) -> ([0..n].reduce (a, b) -> a + b)
所以当你这样说:
newSqSum = sq ((n) -> ([0..n].reduce (a, b) -> a + b))
你用函数作为参数调用sq
。然后sq
将尝试将该函数与其自身相乘,结果将为NaN
,因为函数没有合理的数字表示。最后,您的第三个console.log
尝试将NaN
值称为函数,并且出现错误消息。
对于函数fn1 fn2
和f1
,f2
形式的某些内容不是函数组合,它实际上与编写fn1(fn2)
并且赢得了'相同'除非fn1
显式构造为返回函数,否则生成新函数。如果你想编写这些函数,那么我认为你需要手工完成:
newSqSum = (n) -> sq ((n) -> ([0..n].reduce (a, b) -> a + b)) n
# Or with less hate for the people maintaining your code:
newSqSum = (n) -> sq sqSum n