我在编写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 ]
您误解了您自己的类型函数,平均数总是超过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]
请注意,当您评估length xs
时,1
将评估为averages [(2.0,1.0,3.0)]
。该列表包含一个元素:一个元组。由于要对三元组的元素求平均,因此可以除以3
。
[其他人解释了为什么您得到错误的答案,但是我想敦促您将问题分为两部分。
averageTriple :: (Double, Double, Double) -> Double
averageTriple (x,y,z) = ...
averageTriples :: [(Double, Double, Double)] -> [Double]
averageTriples ts = ... -- use averageTriple here