Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中将Num转换为小数_Haskell_Int_Tuples_Double - Fatal编程技术网

在Haskell中将Num转换为小数

在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

基本上我有一些练习来学习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))
我认为这与我返回一个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))