我正在做一個檢查是否只有一個元素滿足給定條件的任務,我考慮過傳遞 map 以獲取布林值串列,然后計算它是否具有值 1 如果它確實回傳 True 如果不是那么我回傳False。
single :: (a -> Bool) -> [a] -> Bool
single p [] = False
single p a = map p a
let c = single p a
single count True c = if k == 1
then True
else False
我算的是:
count :: (Num a, Eq b) => b -> [b] -> a
count _ [] = 0
count x list = sum $ map (const 1) $ filter (== x) list
uj5u.com熱心網友回復:
您的解決方案包含一些錯誤。例如 single 的第二個引數是一個串列,所以single count True c沒有意義。您可以使用:
single :: (a -> Bool) -> [a] -> Bool
single p a = count True (map p a) == 1
但效率不高。filter p a將產生一個長度與 相同的串列filter (== True) (map p a),并且不需要先映射然后過濾。此外,通過計算滿足條件的專案的數量,您將列舉整個串列,即使您已經找到了兩個匹配的專案,因此您知道它不能再包含完全匹配的一個專案。
您可以filter在只有一個專案的串列上使用和模式匹配,并讓它回傳True,對于其他兩種情況(空串列和具有兩個或更多專案的串列),我們回傳False,所以:
single :: (a -> Bool) -> [a] -> Bool
single p a = case filter p a of
[_] -> True
_ -> False
如果它可以找到滿足給定條件的兩個專案,這將防止列舉整個串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/445368.html
標籤:哈斯克尔
