你可以在Haskell中使用任何大小的数字进行算术运算吗?如果是这样,怎么样?

Ath*_*ark 1 haskell types casting type-conversion infinite

Haskell有关联的能力maxmin价值观与数据类型,但它也有理论上无限数量的工作(如添加1超过最大Integer)以预期的方式?什么使Num类型类如此重要?

Ell*_*son 6

Haskell提供了类类来表达数据类型的各种不同属性.

数字类型

考虑数字数据(Int,Word,Double,Integer,等).所有这些类型共享一组概念操作:它们可以被添加,相乘,减去,否定等.任何共享这些属性的Num类型都可以成为类型类的实例.

有界类型

以某种方式限制的类型由不同的类型类表示:Bounded.在我的系统中GHCI与只加载默认的模块,我看Bounded情况为Ordering,Int,Char,和Bool.Int受机器字的大小,CharUnicode标准的界限Bool以及Ordering声明的限制所限制.

Double不是Bounded,因为它能够表达无穷大(因此在概念上是无界的).Integer也不Bounded是因为上限不一定是可判定的也不是常数(它受可用内存的限制).尽管如此,这两者仍然能够表达数字类型的属性,所以Num即使它们不是,它们仍然是Bounded.

溢出

关于溢出,虽然已经证明它Integer不会溢出,Int并且Word(它们Bounded在内存中的固定宽度表示)将溢出而没有警告或错误.在我的系统上,1 + maxBound :: Int由于两个补码而溢出到minBound,尽管这不是保证行为.Word溢出为0,因为它是无符号数据类型.

请记住,Bounded类型可能不会以"预期的方式"溢出.Haskell规范没有指定Bounded类型应该如何溢出,因此留给编译器设计者.请注意,这些数据类型的内部表示也未指定,因此不应假设两个补码.实际上,即使a的大小Int也只能保证为29位.

  • 这是另一个未指明的事情.默认情况下,GHC使用GNU多精度算术库(GMP),但也提供`integer-simple`作为"足够快"的纯Haskell替换.http://ghc.haskell.org/trac/ghc/wiki/ReplacingGMPNotes,特别是参考文献,可能是有趣的阅读. (2认同)