returns 数字列表的加权平均值的函数
Function that returns a weighted average from a list of lists of numbers
Write the weightedAverage :: [[Int]] -> Double
function, that calculates the grades' weighted average.
For example:
weightedAverage [[3], [5]] == 4.0
weightedAverage [[3,3], [5,5]] == 4.0
weightedAverage [[1,5], [5,5]] == 4.0
weightedAverage [[3,3,3,3], [5,5], [5,5]] == 4.0
到目前为止,我设法编写了一个函数 returns 列表的平均值:
listAverage :: [Int] -> Double
listAverage [] = 0.0
listAverage x = fromIntegral(sum x)/fromIntegral(length x)
我想使用以下代码在我的 weightedAverage
函数中实现它:
weightedAverage [[]] = 0.0
weightedAverage [x] = listAverage x
weightedAverage (x:xs) = (listAverage x + weightedAverage (xs))/fromIntegral length(x:xs)
问题是我收到 Ambiguous type variable 't0' arising from a use of 'length'
错误以及 No instance for (Integral (t0 a0 -> Int)) arising from a use of 'fromIntegral'
错误。我也认为我的递归没有正确实现。
列表的权重是项目的数量。因此,这意味着我们可以简单地连接列表的列表,然后确定平均值,因此您可以通过以下方式实现:
weightedAverage :: [[Int]] -> Double
weightedAverage = listAverage . <strong>…</strong>
其中 …
是一个函数 :: [[a]] -> [a]
,它将项目列表转换为这些项目的列表。
至于 listAverge
,使用两个分别跟踪总和和长度的累加器可能更有意义,例如:
listAverage :: [Int] -> Double
listAverage = go (0 :: Integer) (0 :: Word) . map toInteger
where go !s !n [] = fromRational (s % toInteger n)
go s n (x:xs) = …
Write the
weightedAverage :: [[Int]] -> Double
function, that calculates the grades' weighted average.For example:
weightedAverage [[3], [5]] == 4.0
weightedAverage [[3,3], [5,5]] == 4.0
weightedAverage [[1,5], [5,5]] == 4.0
weightedAverage [[3,3,3,3], [5,5], [5,5]] == 4.0
到目前为止,我设法编写了一个函数 returns 列表的平均值:
listAverage :: [Int] -> Double
listAverage [] = 0.0
listAverage x = fromIntegral(sum x)/fromIntegral(length x)
我想使用以下代码在我的 weightedAverage
函数中实现它:
weightedAverage [[]] = 0.0
weightedAverage [x] = listAverage x
weightedAverage (x:xs) = (listAverage x + weightedAverage (xs))/fromIntegral length(x:xs)
问题是我收到 Ambiguous type variable 't0' arising from a use of 'length'
错误以及 No instance for (Integral (t0 a0 -> Int)) arising from a use of 'fromIntegral'
错误。我也认为我的递归没有正确实现。
列表的权重是项目的数量。因此,这意味着我们可以简单地连接列表的列表,然后确定平均值,因此您可以通过以下方式实现:
weightedAverage :: [[Int]] -> Double
weightedAverage = listAverage . <strong>…</strong>
其中 …
是一个函数 :: [[a]] -> [a]
,它将项目列表转换为这些项目的列表。
至于 listAverge
,使用两个分别跟踪总和和长度的累加器可能更有意义,例如:
listAverage :: [Int] -> Double
listAverage = go (0 :: Integer) (0 :: Word) . map toInteger
where go !s !n [] = fromRational (s % toInteger n)
go s n (x:xs) = …