所以我有一個函式,它接受一個字符和一個元組串列[元組是一個包含一個字符和一個整數的對]。如果字符與元組字符匹配,則相應的數字加一。如果不是,則元組按原樣列印。
所以基本上
foo 'a' [('a',1),('b',2),('c',1)]
應該屈服
[('a',2),('b',2),('c',1)]
我撰寫了以下代碼,但可以理解的是,它跳過了最后一個元組的列印:
foo a ((x,y):xs) | xs == [] = []
| x==a = (x,y 1):foo a xs
| x/=a = (x,y):foo a xs
foo 'a' [('a',1),('b',2),('c',1)]
O/P : [('a',2),('b',2)]
如何修改函式使其也考慮最后一個元組?如果元素不存在于元組串列中,我還希望能夠添加一個計數為 1 的元組
uj5u.com熱心網友回復:
注意如果我們嘗試將 foo 應用于空串列會發生什么:
λ> foo 'a' []
*** Exception: <interactive>:(90,1)-(92,40): Non-exhaustive patterns in function foo
對可以模式匹配的事物使用守衛通常是不受歡迎的。讓我們稍微重寫一下 foo,希望它能讓例外的原因變得清晰,并幫助您了解應該如何解決問題:
foo _ (_:[]) = [] -- the pattern could also be `[_]`
foo a ((x,y):xs) | x==a = (x,y 1):foo a xs
| x/=a = (x,y):foo a xs
現在很明顯一個元素串列被丟棄了:
λ> foo 'a' [('a',1)]
[]
讓這個。此外,守衛強迫我們復制作業,讓我們將其洗掉。
foo _ [] = []
foo a ((x,y):xs) = (x, if x == a then y 1 else y):foo a xs
瞧:
λ> foo 'a' []
[]
λ> foo 'a' [('a',1)]
[('a',2)]
λ> foo 'b' [('a',1),('b',2),('c',3)]
[('a',1),('b',3),('c',3)]
uj5u.com熱心網友回復:
您的xs == []案例需要在與模式匹配相同的級別上完成,而不是在它之后完成。
foo :: a -> [(a, Int)] -> [(a, Int)]
foo _ [] = []
foo a ((x, y):xs)
| x==a = (x, y 1) : foo a xs
| otherwise = (x, y ) : foo a xs
您的版本僅檢查尾部(不包括第一個元素)是否為空。您想檢查整個串列是否為空并以不同方式處理該情況。
旁注:如果你用 編譯 Haskell -Wall,它會警告你關于部分函式。我建議始終使用-Wall. 它警告您的 99% 的事情都是真正好的建議,并且可以根據需要輕松禁用少數愚蠢的警告。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316834.html
上一篇:“可撤銷”應用函子的例子?
下一篇:在Haskell函式中提取引數
