我想要一个从给定标记列表计算平均标记的函数。这是我到目前为止所做的:
getAverageRate :: [Int]->Int
getAverageRate marks = (fromIntegral (foldr (+) 0 marks))/(fromIntegral (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))
事情是Int
代表一个整数,所以能够除以整数是没有意义的,因为大多数除法运算得出的结果都不是整数。
幸运的是div
,我们有,这是整数除法,所以您可以
average :: [Int] -> Int
average [] = error "Can't average an empty list"
average xs = sum xs `div` length xs
如果您不想使用整数除法,那么我们可以做类似的事情
average :: [Int] -> Double
average xs = fromIntegral (sum xs) / fromIntegral (length xs)
只是将一切提升为一个Double
部门。
最后,您可以选择一种四舍五入的方法,然后使用现有的方法
average xs = round $ fromIntegral (sum xs) / fromIntegral (length xs)
(友好的邻里警告sum
是邪恶的,foldl
而不是使用,foldl'
因此-O2
在使用长列表时一定要进行编译)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句