#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