2012-01-28 22 views
0

在程序下面的前兩個日誌工作正常。我在第三和最後的日誌中沒有做任何新的事情,但它在運行時崩潰了。腳本中的錯誤在哪裏?我已經查了很多次,它看起來像是對它上面經過驗證的工作代碼的相當微不足道的修改。爲什麼我的CoffeeScript程序出現「編號不是函數」錯誤?

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

你的預期結果是什麼? – Sandro 2012-01-28 04:07:52

回答

0

這是一個函數,而不是一個數字:

(n) -> ([0..n].reduce (a, b) -> a + b) 

所以當你這樣說:

newSqSum = sq ((n) -> ([0..n].reduce (a, b) -> a + b)) 

你調用sq與函數作爲它的參數。然後sq將嘗試將該函數與自身相乘,結果將爲NaN,因爲函數沒有合理的數字表示形式。最後,您的第三個console.log會嘗試將該值作爲函數調用,並且存在您的錯誤消息。

形式fn1 fn2的東西,對於功能f1f2,不是一個函數組成,它其實是一樣的書寫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 
相關問題