1

Haskell 能够将值与数据类型关联max起来min,但它是否也能以预期的方式处理理论上无限的数字(比如1在 的最大值上加法)?Integer是什么让Numtypeclass 如此重要?

4

2 回答 2

6

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

数值类型

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

有界类型

以某种方式有界的类型由不同的类型类表示:Bounded. 在我的 GHCI 系统上,仅加载了默认模块,我看到BoundedOrderingIntCharBool. Int受机器字的大小、CharUnicode 标准的范围以及Bool它们Ordering的声明的限制所限制。

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

溢出

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

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

于 2013-10-02T06:23:32.847 回答
4

你有几种不相关的问题。

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

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

于 2013-10-02T04:50:56.113 回答