поведение FoldL против Foldr с бесконечными списками
Код для функции myAny вэтот вопрос использует Foldr. Он останавливает обработку бесконечного списка, когда предикат удовлетворен.
Я переписал это, используя foldl:
myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldl step False list
where
step acc item = p item || acc
(Обратите внимание, что аргументы функции шага правильно обращены.)
Однако он больше не останавливает обработку бесконечных списков.
Я попытался отследить выполнение функции, как вApocalisp ответ:
myAny even [1..]
foldl step False [1..]
step (foldl step False [2..]) 1
even 1 || (foldl step False [2..])
False || (foldl step False [2..])
foldl step False [2..]
step (foldl step False [3..]) 2
even 2 || (foldl step False [3..])
True || (foldl step False [3..])
True
Однако, это не так, как ведет себя функция. Как это не так?