双打列表的平均值

问题描述 投票:2回答:3

我在编写Haskell函数时遇到一些问题。我正在尝试获取双打的三连冠的平均值。当我仅将'length 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 ]

haskell
3个回答
5
投票

您误解了您自己的类型函数,平均数总是超过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
投票

请注意,当您评估length xs时,1将评估为averages [(2.0,1.0,3.0)]。该列表包含一个元素:一个元组。由于要对三元组的元素求平均,因此可以除以3


0
投票

[其他人解释了为什么您得到错误的答案,但是我想敦促您将问题分为两部分。

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

averageTriples :: [(Double, Double, Double)] -> [Double]
averageTriples ts = ... -- use averageTriple here
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.