我在列表中有两个元组。例如:[("A",100,2),("B",50,3)]
。我需要将每个元组的第二个和第三个元素相乘,总计并显示它。例如:
100* 2 = 200
(将此添加到变量中),
50* 3 = 150
(将此添加到同一个变量),
Grant total = 350
(我只想显示这个)。
如果有人能建议我解决这个问题,对我来说将是一个很大的帮助。
答案 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