我想要一个计算给定标记列表的平均标记的函数。这是我到目前为止所做的:
getAverageRate :: [Int]->Int
getAverageRate marks = (fromIntegral (foldr (+) 0 marks))/(fromIntegral (length marks))
我要做的是通过使用'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))
答案 0 :(得分:7)
问题在于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
进行编译。