Вычисление суммы значений в списке кортежей в haskell

#haskell

#haskell

Вопрос:

У меня есть два кортежа в списке. Например: [("A",100,2),("B",50,3)] . Мне нужно умножить второй и третий элементы каждого кортежа, просуммировать итоговые значения и показать это. Например:

100* 2 = 200 (добавьте это в переменную),
50* 3 = 150 (добавьте это в ту же переменную),
Предоставьте total = 350 (я хочу отобразить только это).

Если кто-нибудь может предложить мне решение для этого, это было бы большим подспорьем для меня.

Ответ №1:

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

UPD: пытаюсь добавить какое-то объяснение

Итак, у нас есть кортеж ("A",100,2) . Нам нужно получить произведение второго и третьего элемента? С помощью анонимной функции.

 λ> ((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
  

Мы можем использовать $ (function application) вместо круглых скобок.

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

Выполнено.

Комментарии:

1. На самом деле, трудно решить, что следует объяснять. Ответ обновлен.

2. Да, для этих простых вопросов это верно. В подобных вопросах я также поддерживаю руководство, а не полное решение: подсказка, запустите OP вместо того, чтобы решать его проблему за него. В любом случае, 1 🙂

Ответ №2:

Использование понимания списка:

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

Комментарии:

1. Использование понимания списка лучше, чем что-либо еще, или вы просто предлагаете другой способ генерирования ответа?

2. @dmitry.malikov: Я думаю, что это немного легче читать, но в остальном это должно быть эквивалентно вашему решению.

Ответ №3:

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

Это расширяется до: ((0 100 * 2) 50 * 3)

Комментарии:

1. -1 еще одно полное решение без объяснений. Я ищу людей, которые дадут рекомендации, а не ответ, который можно вырезать и вставить; или, если будет дан полный ответ, по крайней мере, некоторое представление о том, как вы к нему пришли.

Ответ №4:

 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
  

Ответ №5:

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