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

时间:2013-10-02 04:43:38

标签: haskell types casting type-conversion infinite

Haskell能够将maxmin值与数据类型相关联,但它也可以使用理论上无限的数字(比如在1的最大值上添加Integer )在预期的方式?是什么让Num类型类如此重要?

2 个答案:

答案 0 :(得分:6)

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

数字类型

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

有界类型

以某种方式限制的类型由不同的类型类表示:Bounded。在我的GHCI系统中,只加载了默认模块,我看到BoundedOrderingIntChar的{​​{1}}个实例。 Bool受机器字大小限制,Int受Unicode标准范围限制,CharBool受其声明限制。

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

溢出

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

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

答案 1 :(得分:4)

你有几种无关的问题。

Integer有点无界限,这意味着它可以处理任何大小的数字(从技术上讲,它被底层库限制为非常大的东西(更准确地说是2 ^(2 ^ 32)),你会没有任何问题。)所以没有“Integer的最大值”的真实概念。

Num类型类是重要的,因为可以添加,减去的所有内容都具有绝对值等等Num并且适用于Num上的所有函数。因此,如果您需要编写一个使用其中一个操作的函数,它将适用于所有Num。因此,简而言之,Num类型类很重要,因为所有类型类都很重要!