撰寫
weightedAverage :: [[Int]] -> Double函式,計算成績的加權平均值。例如:
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
到目前為止,我設法撰寫了一個回傳串列平均值的函式:
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'錯誤。我也認為我的遞回沒有正確實作。
uj5u.com熱心網友回復:
串列的權重是專案的數量。因此,這意味著我們可以簡單地連接串列串列,然后確定平均值,因此您可以使用以下方法實作:
weightedAverage :: [[Int]] -> Double
weightedAverage = listAverage . …
where…是一個:: [[a]] -> [a]將專案串列轉換為這些專案串列的函式。
As for the listAverge, it might make more sense to work with two accumulators that keep track of the sum and the length respectively, something like:
listAverage :: [Int] -> Double
listAverage = go (0 :: Integer) (0 :: Word) . map toInteger
where go !s !n [] = fromRational (s % toInteger n)
go s n (x:xs) = …
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/355729.html
