计算haskell中元组列表中的值的总和

时间:2011-11-12 18:21:30

标签: haskell

我在列表中有两个元组。例如:[("A",100,2),("B",50,3)]。我需要将每个元组的第二个和第三个元素相乘,总计并显示它。例如:

100* 2 = 200(将此添加到变量中),
 50* 3 = 150(将此添加到同一个变量),
 Grant total = 350(我只想显示这个)。

如果有人能建议我解决这个问题,对我来说将是一个很大的帮助。

5 个答案:

答案 0 :(得分:13)

λ> sum $ map (\(_,y,z) -> y*z ) [("A",100,2),("B",50,3)]
350

UPD:尝试添加一些解释

所以,我们有一个元组("A",100,2)。我们需要获得第二和第三元素的产品?使用anonymous function

λ> (\(x,y,z) -> y*z) ("A",100,2)
200

X在这里无法使用,所以我们可以通过它

λ> (\(_,y,z) -> y*z) ("A",100,2)
200

然后我们应该使用map将该函数应用于这些元组的列表。

λ> map (\(_,y,z) -> y*z) [("A",100,2),("B",50,3)]
[200,150]

最后一件事是找[Int]sum的总和。

λ> sum (map (\(_,y,z) -> y*z) [("A",100,2),("B",50,3)])
350

我们可以使用$(函数应用程序)而不是括号。

λ> sum $ map (\(_,y,z) -> y*z) [("A",100,2),("B",50,3)]
350

完成。

答案 1 :(得分:8)

使用列表理解:

*Main> let tuples = [("A",100,2),("B",50,3)]
*Main> sum [x*y | (_,x,y) <- tuples]
350

答案 2 :(得分:4)

foldl (\a (x, y, z) -> a + y*z) 0 [("A", 100, 2), ("B", 50, 3)]

这扩展为:((0 + 100 * 2)+ 50 * 3)

答案 3 :(得分:0)

import Data.List (foldl')
sum_tuple_products = (foldl' (+) 0) . map (\(_, y, z) -> y * z)

您可以通过以下方式查看此代码:map首先将元组列表(x, y, z)转换为产品列表y * z,然后foldl'添加所有元素那份清单。

*Main> sum_tuple_products [("a", 100, 2), ("B", 50, 3)]
350

答案 4 :(得分:0)

doit = foldr (\(_,b,c) acc -> b*c + acc) 0