在Haskell中将Int分为Int

Bao*_*Ngo 2 int haskell

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

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)

Dan*_*zer 8

事物是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使用长列表编译)

  • @devshorts它基于`foldl`,它可以在你不期望的情况下进行堆栈溢出.它适用于`-O2`但搜索foldl vs foldl' (3认同)
  • @J.Abrahamson 我想你忘记了链接?我实际上很喜欢一个好的教程来指出,所以请分享:) (2认同)
  • 哦,我做到了:http://stackoverflow.com/questions/20356742/foldr-foldl-haskell-explanation/20359256#20359256感谢您通知我 (2认同)