在Haskell中将Num转换为小数

时间:2019-02-12 18:55:19

标签: haskell int tuples double

基本上,我有一些练习来学习Haskell中的元组。

在此示例中,我声明一个名为StudentMark的类型,该类型要求:

  • 字符串(学生的姓名)
  • 整数(学生的分数,0至100)。

然后我必须创建一个函数,以将学生的分数上限限制为40。

但我在执行此操作时遇到此错误:

No instance for (Fractional Int) arising from a use of ‘/’

我认为这与我返回一个double而不是一个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))

1 个答案:

答案 0 :(得分:2)

  

我认为这与我返回一个double而不是一个Int有关,但是我不知道该如何解决。

不完全是,在Haskell中,没有隐式转换。

由于StudentMark实际上是(String, Int)的别名,因此意味着mrkInt。但是您的部门(/) :: Fractional 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))