Среднее из списка двойников - PullRequest
2 голосов
/ 08 октября 2019

У меня проблемы с написанием функции на Haskell. Я пытаюсь получить среднее из списка тройки двойников. когда я делю только на «длину xs», я получаю ошибку, что длина является Int, поэтому я попытался использовать fromIntegeral, и он не дает мне ошибку, но не дает правильный ответ. Например, если я проверяю, averages [(2.0,1.0,3.0)] возвращает [6.0]

averages :: [(Double, Double, Double)] -> [Double]
averages xs = [ (x+y+z) / fromIntegral (length xs) | (x,y,z) <- xs ]

Ответы [ 3 ]

6 голосов
/ 08 октября 2019

Вы неправильно понимаете свою собственную функцию типа, среднее значение всегда больше 3, потому что у вас есть список триплетов (или кортежей из трех?):

averages :: [(Double, Double, Double)] -> [Double]
averages xs = [ (x+y+z) / 3 | (x,y,z) <- xs ]


$> averages [(8,6,7), (4,4,10), (1,1,1)]
=> [7.0,6.0,1.0]
4 голосов
/ 08 октября 2019

Обратите внимание, что length xs будет оцениваться до 1, когда вы оцениваете averages [(2.0,1.0,3.0)]. Список содержит один элемент: кортеж. Поскольку вы усредняете элементы триплета, вы можете просто разделить на 3.

0 голосов
/ 08 октября 2019

Другие объяснили, почему вы получаете неправильные ответы, но я хотел бы призвать вас разбить вашу проблему на две части.

averageTriple :: (Double, Double, Double) -> Double
averageTriple (x,y,z) = ...

averageTriples :: [(Double, Double, Double)] -> [Double]
averageTriples ts = ... -- use averageTriple here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...