我正在撰寫一個函式來檢查串列是否至少包含一個元素 N 次
atLeastNtimes :: Eq a => Int -> a -> [a] -> Bool
atLeastNtimes n a l = n <= (sum [1 | x <- l, (x == a)])
它適用于有限串列,但我正在努力使其適用于無限串列,例如:
atLeastNtimes 100 'a' (repeat 'a')
uj5u.com熱心網友回復:
以下是一些可能的替代方法:
遞回定義您的函式,而無需嘗試檢查完整串列,而只檢查所需的前綴。
首先
filter列出串列,以便僅保留您要計算的元素。然后,使用drop (n-1) xs洗掉n-1元素(如果有),并檢查結果串列是否不為空(使用null)。請注意,dropping 比串列中的元素多的元素不是錯誤,它會導致一個空串列。
uj5u.com熱心網友回復:
我們可以把問題分成兩部分。第一個只是檢查串列是否足夠長。
-- | Check whether the length of a list
-- is at least a certain value.
lengthAtLeast :: Int -> [a] -> Bool
lengthAtLeast n0 xs0 = foldr go stop xs0 n0
where
stop n = n <= 0
go _ _ n | n <= 0 = True
go _ r n = r (n - 1)
第二個是過濾,這filter對你有用。所以
atLeastNtimes :: Eq a => Int -> a -> [a] -> Bool
atLeastNtimes n a = lengthAtLeast n . filter (a ==)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/389028.html
