Zauważyłem, że istnieje różnica między Haskell i Erlang, jeśli chodzi o foldl
.Haskell vs. erlang: różnica w foldl?
Dla foldr
, oba języki zwraca te same wyniki:
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
Ale zwracane wartości dla foldl
są różne:
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
Jak można wytłumaczyć tę różnicę?
Kolejność argumentów pierwszego argumentu 'foldl' i' foldr' wydaje się być inna w Haskell: 'foldl :: Foldable t => (b -> a -> b) -> b -> ta - > b' i 'foldr :: Składany t => (a -> b -> b) -> b -> ta -> b'. – Dogbert
'2 * x + y' vs' X + 2 * Y' - czy to jest zamierzone? – chi
@chi Bardzo spostrzegawczy, okazuje się, że pomieszałem te dwa! Jednak problem nadal istnieje, z tym wyjątkiem, że jest teraz dokładnie odwrotnie ... 'foldr' zachowuje się tak samo, ale' foldl' zwraca inną liczbę. –