我想创建一个函数,将列表中每个元组的第二个元素相加。到目前为止,我有:
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
我该怎么做?
如果一个空的成分列表无论如何都应该产生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
。
有可能简化CCD_ 7。Willem Van Onsem的回答对此有一些很好的指导。
您可以省略递归,转而使用map
:
pizza :: Num b => [(a, b)] -> b
pizza = (5 +) . sum . map snd
或更详细:
pizza :: Num b => [(a, b)] -> b
pizza xs = 5 + (sum (map snd xs))