Class 什么';这两者之间的区别是什么;浮动;及;“分数”;在哈斯克尔?
我希望“c”是Num或Float的列表。为什么是分数?Haskell中是否有隐式类型转换?Haskell中没有隐式类型转换。数字文字具有多态类型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是一个
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