[英]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
惰性計算。 如果我嘗試使用無限列表作為輸入,則程序將永遠掛起。
基本上,一旦我在列表中找到x的任何實例並返回true,就想“爆發”,否則返回false。
謝謝您的幫助。
讓我們從文件foldr
模式的基本框架開始:
elem :: Eq a => [a] -> Bool
elem x xs = foldr kons knil xs
當foldr
看到[]
,它將返回knil。 由於空列表中沒有任何內容,因此我們得出以下結論:
knil = False
當foldr kons False
看到列表a : as
,它返回kons a (foldr kons False as)
。 我們可以歸納地假設foldr kons False as = elem x as
,因此我們尋求解決kons
elem x (a : as) = kons a (elem x as)
我敢打賭,您可以通過提出kons
的定義來kons
。 注意布爾短路行為,以使其高效並避免出現無限列表問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.