gpt4 book ai didi

haskell - 在 Haskell 中将 Int 划分为 Int

转载 作者:行者123 更新时间:2023-12-02 07:00:19 25 4
gpt4 key购买 nike

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

getAverageRate :: [Int]->Int
getAverageRate marks = (fromIntegral (foldr (+) 0 marks))/(fromIntegral (length marks))

我要做的是通过使用“foldr”获取列表中所有标记的总和,然后除以“长度标记”。尽管我已经使用了“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 进行编译 使用长列表时)

关于haskell - 在 Haskell 中将 Int 划分为 Int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22029641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com