簡體   English   中英

如何使用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惰性計算。 如果我嘗試使用無限列表作為輸入,則程序將永遠掛起。

基本上,一旦我在列表中找到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM