Tôi nhận thấy có sự khác biệt giữa Haskell và Erlang khi nói đến foldl
.Haskell vs erlang: sự khác biệt trong foldl?
Đối foldr
, cả hai ngôn ngữ trả lại kết quả tương tự:
foldr (\x y -> 2*x+y) 4 [1, 2, 3] -- returns 49
lists:foldr(fun(X, Y) −> X+2∗Y end, 4, [1,2,3]). % returns 49
Nhưng các giá trị để đổi lấy foldl
là khác nhau:
foldl (\x y -> x+2*y) 4 [1, 2, 3] -- returns 16
lists:foldl(fun(X, Y) −> X+2∗Y end, 4, [1,2,3]). -- returns 43
Làm thế nào sự khác biệt này có thể giải thích?
Thứ tự của đối số cho đối số đầu tiên của 'foldl' và' foldr' có vẻ khác trong Haskell: 'foldl :: Foldable t => (b -> a -> b) -> b -> ta - > b' và 'foldr :: Có thể gập lại t => (a -> b -> b) -> b -> ta -> b'. – Dogbert
'2 * x + y' so với' X + 2 * Y' - được dự định? – chi
@chi Rất quan sát, hóa ra tôi đã trộn lẫn cả hai! Tuy nhiên, vấn đề vẫn còn tồn tại, ngoại trừ việc nó bây giờ là chính xác theo cách khác xung quanh ... 'foldr' cư xử như nhau, nhưng' foldl' trả về một số khác nhau. –