Вычислить среднее значение списка внутри кортежа

#list #haskell #tuples

#Список #haskell #кортежи

Вопрос:

Я пытаюсь вычислить среднее значение, учитывая список, который имеет такую структуру:

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 и get [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:

Ну, вам просто не хватает последнего шага:

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