如何使用 Haskell 中的 foldr 函数在无限列表中查找元素?

How do I find an element in an infinite list using the foldr function in Haskell?

我正在尝试使用 foldr 函数在 Haskell 中创建 elem 函数的新实现。

到目前为止我有这个:

count :: Eq a => a -> [a] -> Integer
count x (y:ys) = foldl (\counter y -> if y == x then counter + 1 else counter) 0 ys
count _ [] = 0

elem' :: Eq a => a -> [a] -> Bool
elem' x (y:ys) = foldr (\i elem-> if (count x (y:ys)) > 0 then True else False) False ys
elem' _ [] = False

count 函数使用 foldl 计算 x(我写的另一个函数)出现的次数。这适用于有限列表,但问题是我想利用无限列表的 foldr 惰性计算。如果我尝试使用无限列表作为输入,程序将永远挂起。

基本上我想 "break out" 一旦我在列表中找到 x 的任何实例并且 return 为真,否则 return 为假。

感谢您的帮助。

让我们从 foldr 模式的基本框架开始:

elem :: Eq a => [a] -> Bool
elem x xs = foldr kons knil xs

foldr看到[]时,它会return knil。由于没有什么是空列表的元素,我们得出结论

knil = False

foldr kons False 看到列表 a : as 时,它 return 会 kons a (foldr kons False as)。我们可以归纳地假设 foldr kons False as = elem x as,因此我们试图在

中求解 kons
elem x (a : as) = kons a (elem x as)

我敢打赌,您可以通过给出 kons 的定义来完成。注意布尔短路行为以提高效率并避免无限列表问题。