此问题中 myAny函数的代码使用文件夹。当满足谓词时,它将停止处理无限列表。
我用foldl重写了它:
myAny :: (a -> Bool) -> [a] -> Bool
myAny p list = foldl step False list
where
step acc item = p item || acc
(请注意,step函数的参数已正确反转。)
但是,它不再停止处理无限列表。
我试图按照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
但是,这不是函数的行为方式。这怎么了
富国沪深
不负相思意
慕码人2483693