這是我的代碼:
example = [1,-4,7,12]
positiveSum :: [Int] -> Int
positiveSum (x) = 0
positiveSum (x:xs) = result
where
result = sum [y y | y <- xs, y > 0]
main = do
print (positiveSum example)
當我運行它時,我得到:
Main.hs:5:1: warning: [-Woverlapping-patterns]
Pattern match is redundant
In an equation for `positiveSum': positiveSum (x : xs) = ...
|
5 | positiveSum (x:xs) = result
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^...
我不能在串列理解中使用“xs”,我不明白為什么。這是一個參考,我應該可以使用它。為什么是多余的?
編輯:
答案解決了問題,我將任何內容與第一個 (x) 匹配。另外,我把自己弄糊涂了,兩次申請總和。這是正確的代碼:
positiveSum :: [Int] -> Int
positiveSum [] = 0
positiveSum xs = result
where
result = sum [x | x <- xs, x > 0]
uj5u.com熱心網友回復:
您似乎認為positiveSum (x) = 0只會匹配空串列的情況,但實際上它會匹配任何內容,這使得下一行變得多余,因為它永遠不會被嘗試。你的意思是寫positiveSum [] = 0在那里。另外,請注意,您的第二種情況,即使它現在將運行,也會丟棄串列的頭部,這可能不是您的本意。
uj5u.com熱心網友回復:
模式匹配從上到下,所以每次呼叫都positiveSum回傳0。由于第一條規則的模式是positiveSum (x) = 0匹配所有內容,因為每個值都可以系結到x。通過將該規則設為最后一條,您可以避免此問題:
positiveSum :: [Int] -> Int
positiveSum (x:xs) = result
where
result = sum [y y | y <- xs, y > 0]
positiveSum (x) = 0
0使用此代碼,我們僅在引數沒有尾部時才回退到這種情況,從而導致預期的行為。
uj5u.com熱心網友回復:
您無需區分空串列和非空串列:您可以計算過濾串列的總和:
positiveSum :: [Int] -> Int
positiveSum xs = sum [y | y <- xs, y > 0]
因此,這里xs的模式與所有可能的串列匹配:空或非空。y將列舉 的所有專案xs,如果y > 0,我們產生該值。然后我們計算該串列的總和。對于一個空串列sum會回傳0,所以無論是否xs為空,并且存在滿足y > 0謂詞的元素,它都會回傳一個值。
另一種選擇是使用filter :: (a -> Bool) -> [a] -> [a]并因此確定總和:
positiveSum :: [Int] -> Int
positiveSum = sum . filter (0 <)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/421377.html
標籤:
上一篇:Vigenere加密程式
