Я столкнулся с проблемой. В чем разница между этими двумя функциями:Функция Haskell foldl ( x y -> x * 2 + y * 2) 0 поведение
foldl (\x y -> x*2 + y*2) 0 [1,2,3] = 22
foldr (\x y -> x*2 + y*2) 0 [1,2,3] = 34
foldl (\x y -> x*2 + y*2) 0 [1,2,3] ⇒ f(f(f(0,1),2),3)
foldr (\x y -> x*2 + y*2) 0 [1,2,3] ⇒ f(3,f(2, f(1,0)))
, где f = \x y -> x*2 + y*2
.
Я понимаю результат foldl
:
x = f(0,1) = 2
y = f(x,2) = 8
z = f(y,3) = 22
Но почему foldr
сумма после результата каждого шага?
2 + 8 + 22 = 34
Если вы пытались получить сумму квадратов, то вы хотите: 'foldl» (\ х -> х + у^2) 0 ' –
отметить также, что это правило, рекомендуется всегда использовать строгую версию 'foldl' -' foldl'', поскольку он не вызывает утечки памяти. – Mark
@Mark спасибо за правильное редактирование –