我是Haskell的新手,我正試圖更新一個元組串列中的一個元素。我的元組串列是[(String, Int)]型別,我只想在我得到的字串在串列中時將整數遞減-1,否則我必須回傳Nothing,我嘗試這樣做:
myFunc :: String -> [(String, Int) ] -> Maybe [(String, Int)] ->
myFunc s [] = Nothing]
myFunc s ((s2,i):xs)
| s == s2 = Just ((s2, i - 1) : xs)
|否則 = myFunc s xs
例如,如果我有[("l1",10), ("l2",20), ("l3",30)]并且想更新 "l2",該函式必須回傳[("l1",10), ("l2",19), ("l3",30)],但我的函式回傳[("l2",19), ("l3",30)>
uj5u.com熱心網友回復:
| otherwise = myFunc s xs
在這里,我們拋棄了串列的第一個元素。這很可能不是你想要的結果。請考慮一下
| otherwise = fmap ((s2, i) :) $ myFunc s xs
如果我們沒有得到一個匹配,我們不想把這個元素扔出去;我們想把它留在串列中不加修改。因此,我們運行遞回呼叫,然后將當前元素重新預置,不做任何修改。
如果你來自于更多的命令式語言,你可能會擔心這個函式不是尾部遞回,這很公平。你的原始函式是尾部遞回的,但這個函式不是。請參閱Haskell Wiki,以了解為什么我們在Haskell中通常不關心這個問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/316937.html
標籤:
