2016-01-12 5 views
-3

Im способен суммировать Zth элемента всех кортежей, но по какой-то странной причине я получаю только 1 после деления моего результата на 2.Haskell + разделение

averageYear :: [(String, String, Int)] -> Int 
averageYear [] = 0 
averageYear ((x,y,z):xs) = (z + (averageYear xs)) `div` (length xs) 

Спасибо !!

+0

lol sorry, огромный brainfart – ajanakos

ответ

7

Математика совершенно неверна.

averageYear [(_, _, 2010)] = (2010 + averageYear []) `div` 2 
          = (2010 + 0) `div` 2 
          = 2010 `div` 2 
          = 1005 

Чтобы вычислить среднее значение, вы должны разделить сумму на количество элементов.

average :: [Int] -> Int 
average xs = sum xs `div` length xs 

averageYear :: [(String, String, Int)] -> Int 
averageYear = average . map (\(_, _, year) -> year) 
+0

отличное решение .. не могли бы вы пояснить, что делает полная остановка (.) И что происходит слэш в последней строке? ty – ajanakos

+0

В Haskell '(.)' является оператором композиции функций, а '\ x -> y' является лямбда-выражением. –

0

@Dietrich Эпп Длина хз равна нулю, а не два в вашем примере.

averageYear ((x,y,z):xs) = (z + (averageYear xs)) `div` (length xs) 

Если xs пусто, тогда длина xs равна нулю, и вы делите на ноль.