在Haskell中将Num转换为小数
基本上我有一些练习来学习Haskell中的元组 在本文中,我声明了一个名为StudentMark的类型,它需要:在Haskell中将Num转换为小数,haskell,int,tuples,double,Haskell,Int,Tuples,Double,基本上我有一些练习来学习Haskell中的元组 在本文中,我声明了一个名为StudentMark的类型,它需要: 字符串(学生的姓名) Int(学生的分数,0到100) 然后我必须创建一个函数,将学生的分数限制在40分以内 但我在做这件事时遇到了一个错误: No instance for (Fractional Int) arising from a use of ‘/’ 我认为这与我返回一个double而不是Int有关,但我不知道如何解决这个问题。代码如下: import Data.Ch
- 字符串(学生的姓名)
- Int(学生的分数,0到100)
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))
我认为这与我返回一个double而不是Int有关,但我不知道如何解决这个问题
不完全是这样,在Haskell中,没有隐式转换
由于StudentMark
实际上是(String,Int)
的别名,这意味着mrk
是Int
。但是您的分区将a类型作为分数a
,并且Int
不是分数
类型类的成员。对于整数分割,可以使用
因此,我们可以这样写:
capMark :: StudentMark -> StudentMark
capMark (std, mrk) = (std, div (mrk * 4) 10)
由于
StudentMark
是字符串
和Int
的元组,因此这在这里似乎没有多大意义。实际上,您应该将其转换回Int
,或者将其保留为Int
,比如(std,div(mrk*4)10)
。
import Control.Arrow(second)
capMark :: StudentMark -> StudentMark
capMark = second ((`div` 10) . (*4))