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
Class 什么';这两者之间的区别是什么;浮动;及;“分数”;在哈斯克尔?_Class_Haskell_Types - Fatal编程技术网

Class 什么';这两者之间的区别是什么;浮动;及;“分数”;在哈斯克尔?

Class 什么';这两者之间的区别是什么;浮动;及;“分数”;在哈斯克尔?,class,haskell,types,Class,Haskell,Types,我希望“c”是Num或Float的列表。为什么是分数?Haskell中是否有隐式类型转换?Haskell中没有隐式类型转换。数字文字具有多态类型 Prelude> let c=[1.0,2.0] Prelude> :t c c :: Fractional t => [t] 标准Haskell将任何带有小数点的数字视为小数,即使小数位数都是0。它也把用科学记数法写的任何东西都当作分数。有一个GHC扩展,如果你愿意的话,你可以用它来更具多态性 至于你标题中的问题,Float是一个

我希望“c”是Num或Float的列表。为什么是分数?Haskell中是否有隐式类型转换?

Haskell中没有隐式类型转换。数字文字具有多态类型

Prelude> let c=[1.0,2.0]
Prelude> :t c
c :: Fractional t => [t]
标准Haskell将任何带有小数点的数字视为小数,即使小数位数都是0。它也把用科学记数法写的任何东西都当作分数。有一个GHC扩展,如果你愿意的话,你可以用它来更具多态性

至于你标题中的问题,
Float
是一个具体类型(
Float:*
),而
fractive
是一个类型类(
fractive:*->Constraint
)。您可以编写许多函数,这些函数将与各种
fractive
RealFrac
RealFloat
类型一起工作,而无需担心精确表示


旁注:
Float
是一种专用类型,用于专门的算法、格式等,在某些情况下,数组的紧凑表示比精度或数值稳定性更重要。当需要浮点时,通常需要的是
Double

您可以实现:

> :t 3
3 :: Num a => a

> :t 3.5
3.5 :: Fractional a => a
“为什么
分数
”的答案基本上是“因为报告这么说”:

浮动文字表示将
fromRational
应用到
Rational
类型的值(即
比率整数
)。鉴于打字方式:

float →   decimal . decimal [exponent]
      |   decimal exponent
整数和浮点文本分别具有
(Num a)=>a
(分数a)=>a

我猜报告是这么说的,因为这是一个很好的简单规则来解释:没有点/指数,它是
Num
-多态的,是的点/指数,它是
分数的
-多态的

两个相关位是:


那么
.0
表示数字的小数部分(即使在本例中是
0
)。
[1.5]
的类型是什么?它不能是
Num
,因为如果它是
Num
,它必须可以转换为,比如说,
Int
,但是没有唯一的合理方法来实现这一点(轮到低?轮到高?轮到偶数?轮到奇数?)。另外,您不希望
1.0
具有类型
Num
,而
1.1
具有类型
分数
。。。一个轻微的打字错误可能会改变程序中太多的内容。这就是报告中的简单规则。@Bakuriu:真的吗?我的GHC-7.10确实认识到了这一点
-XNumDecimals
实际上是从7.8开始提供的。@leftaroundabout现在有了。我想我第一次试的时候打错了。
float →   decimal . decimal [exponent]
      |   decimal exponent
fromInteger  :: (Num a) => Integer -> a  
fromRational :: (Fractional a) => Rational -> a