Я читаю FP в Scala.
Упражнение 3.10 говорит, что переполнение foldRight
(см. изображения ниже).
Насколько я знаю, однако foldr
в Haskell этого не делает.
http://www.haskell.org/haskellwiki/
-- if the list is empty, the result is the initial value z; else
-- apply f to the first element and the result of folding the rest
foldr f z [] = z
foldr f z (x:xs) = f x (foldr f z xs)
-- if the list is empty, the result is the initial value; else
-- we recurse immediately, making the new initial value the result
-- of combining the old initial value with the first element.
foldl f z [] = z
foldl f z (x:xs) = foldl f (f z x) xs
Как такое поведение возможно?
В чем разница между двумя языками/компиляторами, которые вызывают это различное поведение?
Откуда эта разница? Платформа? Язык? Компилятор?
Можно ли написать безопасную для стека foldRight в Scala? Если да, то как?