在哈斯克尔中将 Num 转换为分数



基本上我有一些练习来学习 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))

最新更新