#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