【问题标题】:converting Num to Fractional in Haskell在 Haskell 中将数字转换为小数
【发布时间】:2019-02-13 03:04:09
【问题描述】:

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

在这个我声明了一个名为 StudentMark 的类型,它需要:

  • 字符串(学生姓名)
  • Int(学生的分数,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))

【问题讨论】:

  • 因为StudentMarkStringInt 的元组,这在这里似乎没有多大意义。您实际上应该将其转换回Int,或者将其保留为Int,例如(std, div (mrk * 4) 10)

标签: haskell int tuples double


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-03
    • 2011-01-28
    • 2017-02-25
    • 1970-01-01
    • 2022-09-30
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多