合并元组列表和整数列表

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

合并所有原始列表,newListavgList

期望的输出是

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 ]

列表理解通常比 mapzipzipWith 等的各种组合更直观(即更易于使用)