如何使用 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
的定义来完成。注意布尔短路行为以提高效率并避免无限列表问题。
我正在尝试使用 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
的定义来完成。注意布尔短路行为以提高效率并避免无限列表问题。