合并元组列表和整数列表
Merge list of tuples and list of integers
我是 Haskell 的新手,目前正在学习列表。
我有一个标记列表
[("Tom", 87, 78, 67), ("Dick", 56, 45, 72)]
我需要得到分数的总和及其平均值。这是我的方法。
创建一个函数来计算每个候选人的总分列表
sumOfMarks = (\(a, b, c, d) -> b + c + d)
并将该函数映射到原始列表
newList = map sumOfMarks [("Tom", 87, 78, 67), ("Dick", 56, 45, 72)]
创建一个函数来计算每个候选人的平均分数列表
avgList = map (`div`3) newList
合并所有原始列表,newList
和avgList
期望的输出是
finalList = [("Tom", 87, 78, 67, 232, 77.34), ("Dick", 56, 45, 72, 173, 57.67)]
另一个问题是 - 这是否是解决问题的最佳方法,还有更好的方法吗?
您可以制作一个将 4 元组映射到 5 元组的函数,因此该函数如下所示:
map (\(n, a, b, c) -> (n, a, b, c, …)) oldList
我离开的地方 …
作为练习。
注意div :: Integral a => a -> a -> a
is integer division. If you need to work with floats, you can use (/) :: Fractional a => a -> a -> a
. In order to convert Integral
numbers to Fractional
numbers, you can make use of the fromIntegral :: (Integral a, Num b) => a -> b
函数。
(省略使用 /
而不是 div
所需的转换)
我们可以使用 zipWith3
组合三个列表,或者使用 zip3
、
的列表理解
finalList =
= zipWith3 (\ (n,a,b,c) s avg -> (n,a,b,c,s,avg))
list newList avgList
= [ (n,a,b,c,s,avg) | ((n,a,b,c), (s, avg)) <-
zip list
(zip newList
avgList) ]
= [ (n,a,b,c,s,avg) | ((n,a,b,c), s, avg) <-
zip3 list
(map sumOfMarks list)
(map (`div` 3) (map sumOfMarks list)) ]
= [ (n,a,b,c,s,avg) | ((n,a,b,c), s, avg) <-
zip3 list
(map sumOfMarks list)
(map ((`div` 3) . sumOfMarks) list) ]
= [ (n,a,b,c,a+b+c,(a+b+c)/3)
| (n,a,b,c) <- list ]
= [ (n,a,b,c,s,avg)
| (n,a,b,c) <- list
, let s = a+b+c
, let avg = s/3 ]
列表理解通常比 map
、zip
、zipWith
等的各种组合更直观(即更易于使用)
我是 Haskell 的新手,目前正在学习列表。
我有一个标记列表
[("Tom", 87, 78, 67), ("Dick", 56, 45, 72)]
我需要得到分数的总和及其平均值。这是我的方法。
创建一个函数来计算每个候选人的总分列表
sumOfMarks = (\(a, b, c, d) -> b + c + d)
并将该函数映射到原始列表
newList = map sumOfMarks [("Tom", 87, 78, 67), ("Dick", 56, 45, 72)]
创建一个函数来计算每个候选人的平均分数列表
avgList = map (`div`3) newList
合并所有原始列表,newList
和avgList
期望的输出是
finalList = [("Tom", 87, 78, 67, 232, 77.34), ("Dick", 56, 45, 72, 173, 57.67)]
另一个问题是 - 这是否是解决问题的最佳方法,还有更好的方法吗?
您可以制作一个将 4 元组映射到 5 元组的函数,因此该函数如下所示:
map (\(n, a, b, c) -> (n, a, b, c, …)) oldList
我离开的地方 …
作为练习。
注意div :: Integral a => a -> a -> a
is integer division. If you need to work with floats, you can use (/) :: Fractional a => a -> a -> a
. In order to convert Integral
numbers to Fractional
numbers, you can make use of the fromIntegral :: (Integral a, Num b) => a -> b
函数。
(省略使用 /
而不是 div
所需的转换)
我们可以使用 zipWith3
组合三个列表,或者使用 zip3
、
finalList =
= zipWith3 (\ (n,a,b,c) s avg -> (n,a,b,c,s,avg))
list newList avgList
= [ (n,a,b,c,s,avg) | ((n,a,b,c), (s, avg)) <-
zip list
(zip newList
avgList) ]
= [ (n,a,b,c,s,avg) | ((n,a,b,c), s, avg) <-
zip3 list
(map sumOfMarks list)
(map (`div` 3) (map sumOfMarks list)) ]
= [ (n,a,b,c,s,avg) | ((n,a,b,c), s, avg) <-
zip3 list
(map sumOfMarks list)
(map ((`div` 3) . sumOfMarks) list) ]
= [ (n,a,b,c,a+b+c,(a+b+c)/3)
| (n,a,b,c) <- list ]
= [ (n,a,b,c,s,avg)
| (n,a,b,c) <- list
, let s = a+b+c
, let avg = s/3 ]
列表理解通常比 map
、zip
、zipWith
等的各种组合更直观(即更易于使用)