计算元组内列表的均值

时间:2020-11-12 10:53:44

标签: list haskell tuples

鉴于列表具有以下结构,我正在尝试计算均值:

lData = [("A", "EXP1", 5),("A", "EXP2", 9),("B", "EXP15", 8),("C", "EXP16", 7),("B", "EXP24", 4)]

首先,我按元组的第一个元素对元素进行分组,并获得此元组列表,其中第二个元素是我愿意计算均值的列表:

[("A", [5,9]),("B", [8,4]), ("C", [7])]

当我尝试调用函数computeMean时,出现错误。 我尝试首先通过获取数字数组 snd . head $ myGroup lData并获得[5,9],就可以了。但是不知道如何从那里继续。

我已经创建了函数computeMean,该函数给出了一个列表,并返回列表元素的均值。

computeMean $ snd . head $ myGroup lData正确地获得了均值,但不知道如何将其应用于所有元素。

我要查找的结果是一个包含元组的第一个元素和均值的列表,例如:

[(“A”,7), (“B”,6), (“C”,7)]

但是不能正确解决。有什么建议吗?

import Data.Function (on)
import Data.List (sortBy, groupBy)
import Data.Ord (comparing)

fst3 :: (a, b, c) -> a
fst3 (x, _, _) = x

nextElem :: (a, b, c) -> (c)
nextElem (_, _, c) = (c)

myGroup :: (Eq a, Ord a) => [(a, b, c)] -> [(a, [c])]
myGroup = map (\l -> (fst3 . head $ l, map nextElem l)) . groupBy ((==) `on` fst3) . sortBy (comparing fst3)          
          
computeMean :: [Double] -> Double
computeMean [] = 0
computeMean (a) = sum a / fromIntegral(length a)

lData = [("A", "EXP1", 5),("A", "EXP2", 9),("B", "EXP15", 8),("C", "EXP16", 7),("B", "EXP24", 4)]

main = do
       print $ myGroup lData
       computeMean  $ snd . head $ myGroup lData
      

1 个答案:

答案 0 :(得分:1)

好吧,您只是缺少最后一步:

-- A new function to compute the mean value in the tuple
meanTuple :: (String, [Double]) -> (String, Double)
meanTuple (k, v) = (k, computeMean v)

main = print . map meanTuple . myGroup $ lData