2009-06-26 81 views
0
<!-- first --> 
<script> 
var total = 0; 
var newAccumulator = function() 
{ 
    return function(i) { total += i; }; 
} 

var foldl = function(arr, putNum) 
{ 
    for (var i = 0; i < arr.length; ++i) 
    { 
    putNum(arr[i]); 
    } 
} 

foldl([1, 2, 3, 4], newAccumulator()); 
document.write("Sum: " + total + "<br/>"); 
</script> 

<!-- second --> 
<script> 
var total = 0; 
var newAccumulator = function(i) 
{ 
    total += i; 
} 

var foldl = function(arr, putNum) 
{ 
    for (var i = 0; i < arr.length; ++i) 
    { 
    putNum(arr[i]); 
    } 
} 

foldl([1, 2, 3, 4], newAccumulator()); 
document.write("Sum: " + total + "<br/>"); 
</script> 

回答

2

在調用foldl你叫newAccumulator功能:

foldl([1, 2, 3, 4], newAccumulator()); 

在第一種情況下,它返回不求和函數up:

return function(i) { total += i; }; 

在第二種情況下,對newAccumulator的調用不返回任何內容,所以foldl沒有可調用的函數來計算總和。
您應該直接傳遞到newAccummulator foldl,而不是它的值(不)回報:

foldl([1, 2, 3, 4], newAccumulator); 
3

它想你想

foldl([1, 2, 3, 4], newAccumulator); 

您是在fold1函數執行newAccumulator第二呼叫

2

。通過newAccumulator而不是newAccumulator();

foldl([1, 2, 3, 4], newAccumulator()); 

foldl([1, 2, 3, 4], newAccumulator); 
1

第二不起作用,因爲你不及格與foldl的功能。

在第一個示例中,您執行newAccumulator,並且newAccumulator返回傳遞給foldl的函數... Foldl使用該函數對數字進行求和。

在第二個示例中,您執行newAccumulator並傳遞結果,但newAccumulator的結果不是函數。

此外,您命名爲foldl的函數通常稱爲「foreach」。如果你將結果存儲在一個數組中,它可能被稱爲'map'。 Foldl通常會通過增加總數並返回新總數的函數累積總數。

相關問題