这个问题中 myAnyfunction 的代码使用 foldr。当满足谓词时,它停止处理无限列表。
我用 foldl 重写了一下:
myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldl step False list
where
step acc item = p item || acc
(注意,step 函数的参数被正确地反转了。)
但是,它不再停止处理无限列表。
我尝试像在 天启的回答中那样跟踪函数的执行:
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
然而,这不是函数的行为方式。这怎么会错呢?