基本上我有一些练习来学习 Haskell 中的元组。
在这个中,我声明了一个名为StudentMark的类型,它要求:
- 字符串(学生的姓名(
- Int(学生的分数,0 到 100(。
然后,我必须创建一个函数,将学生的分数上限为最多 40。
但是这样做我得到这个错误:
No instance for (Fractional Int) arising from a use of ‘/’
我认为这与我返回双精度而不是 Int 有关,但我无法弄清楚如何解决这个问题。这是代码:
import Data.Char
type StudentMark = (String, Int)
{- the total mark without cap would be 100, with the cap it would be 40,
if we divide 100/40 we get 2.5 which is a common factor
-}
capMark :: StudentMark -> StudentMark
capMark (std, mrk) = (std, fromIntegral (mrk / 2.5))
我认为这与我返回双精度而不是 Int 有关,但我无法弄清楚如何解决这个问题。
不完全是,在 Haskell 中,没有隐式转换。
由于StudentMark
实际上是(String, Int)
的别名,这意味着mrk
是一个Int
。但是您的除法(/) :: Fractional a => a -> a -> a
将 A 类型作为 Fractional a
,并且Int
不是 Fractional
类型类的成员。对于积分除法,可以使用div :: Integral a => a -> a -> a
因此,我们可以这样写:
capMark :: StudentMark -> StudentMark
capMark (std, mrk) = (std, div (mrk * 4) 10)
或带有second :: Arrow a => a b c -> a (d, b) (d, c)
的较短版本:
import Control.Arrow(second)
capMark :: StudentMark -> StudentMark
capMark = second ((`div` 10) . (*4))