поведение 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

Однако, это не так, как ведет себя функция. Как это не так?

Ответы на вопрос(4)

Ваш ответ на вопрос