В коде для функции myAny в этот вопрос используется foldr. Он останавливает обработку бесконечного списка, когда предикат выполняется.
Я переписал его с помощью foldl:
myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldl step False list
where
step acc item = p item || acc
(Обратите внимание, что аргументы функции шага правильно меняются.)
Однако он больше не останавливает обработку бесконечных списков.
Я попытался проследить выполнение функции, как в Apocalisp answer:
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
Однако это не так, как работает функция. Как это неправильно?