Haskell如何将元组的每一个元素添加到元组列表中



我想创建一个函数,将列表中每个元组的第二个元素相加。到目前为止,我有:

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))

最新更新