在Haskell中将Int分为Int

时间:2014-02-26 01:08:04

标签: haskell int

我想要一个计算给定标记列表的平均标记的函数。这是我到目前为止所做的:

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))

1 个答案:

答案 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进行编译。