我想做一個函式,將串列中每個元組的第二個元素加在一起。到目前為止,我有:
pizza :: [(String, Int)] -> Int
pizza [] = 0
pizza (((a),b):xs) = b pizza xs
這很好用,但是當我想在遞回完成后添加另一個 int 時遇到了問題。
所以我得到的是:
> pizza[("Cheese",10),("Dough",5)]
15
我想在遞回完成后再添加五個,這樣我會得到:
> pizza[("Cheese",10),("Dough",5)]
20
我該怎么做呢?
uj5u.com熱心網友回復:
如果無論如何都應該產生一個空的成分串列5,您可以簡單地將其反映在您的基本案例中。
pizza :: [(String, Int)] -> Int
pizza [] = 5
pizza (((a),b):xs) = b pizza xs
另一方面,如果僅在傳入的串列不為空時發生這種情況,您可以創建一個輔助函式,將其添加5為遞回的基本情況,但只有在傳入的串列不為空時才會使用輔助函式。
pizza :: [(String, Int)] -> Int
pizza [] = 0
pizza lst = pizza' lst
where
pizza' [] = 5
pizza' ((_, x):xs) = x pizza' xs
現在呼叫pizza []會產生0,但pizza [("Cheese",10),("Dough",5)]會產生20。
可能是為了簡化pizza'。Willem Van Onsem 的回答對此有一些很好的指導。
uj5u.com熱心網友回復:
您可以省略遞回并使用 amap代替:
pizza :: Num b => [(a, b)] -> b
pizza = (5 ) . sum . map snd
或更詳細:
pizza :: Num b => [(a, b)] -> b
pizza xs = 5 (sum (map snd xs))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/528533.html
標籤:哈斯克尔
上一篇:XmobarDiskU在Slackware15中無法獲取根磁區資訊
下一篇:Haskell函式導致堆疊溢位
