我想要一个计算给定标记列表的平均标记的函数.这是我到目前为止所做的:
getAverageRate :: [Int]->Int
getAverageRate marks = (fromIntegral (foldr (+) 0 marks))/(fromIntegral (length marks))
Run Code Online (Sandbox Code Playgroud)
我想要做的是通过使用'foldr'然后除以'length marks'来获得列表中所有标记的总和.尽管我已经使用'fromIntegral'这个错误仍然出现,我找不到问题.
No instance for (Fractional Int) arising from a use of `/'
Possible fix: add an instance declaration for (Fractional Int)
In the expression:
(fromIntegral (foldr (+) 0 marks)) / (fromIntegral (length marks))
In an equation for `getAverageRate':
getAverageRate marks
= (fromIntegral (foldr (+) 0 marks))
/ (fromIntegral (length marks))
Run Code Online (Sandbox Code Playgroud)
事物是Int代表一个整数,所以能够划分它是没有意义的,因为大多数分裂都会产生不是整数的东西.
幸运的是div,我们有,这是整数除法,所以你可以做到
average :: [Int] -> Int
average [] = error "Can't average an empty list"
average xs = sum xs `div` length xs
Run Code Online (Sandbox Code Playgroud)
如果你不想使用整数除法,那么我们可以做类似的事情
average :: [Int] -> Double
average xs = fromIntegral (sum xs) / fromIntegral (length xs)
Run Code Online (Sandbox Code Playgroud)
这只是促进一切Double为了分裂.
最后,您可以选择一种舍入方法,并使用您拥有的方法
average xs = round $ fromIntegral (sum xs) / fromIntegral (length xs)
Run Code Online (Sandbox Code Playgroud)
(友好的邻居警告sum是邪恶的,foldl而不是使用,foldl'所以一定要-O2使用长列表编译)