Haskell 能够将值与数据类型关联max
起来min
,但它是否也能以预期的方式处理理论上无限的数字(比如1
在 的最大值上加法)?Integer
是什么让Num
typeclass 如此重要?
2 回答
Haskell 提供类型类来表达数据类型的各种不同属性。
数值类型
考虑数字数据(Int
、Word
、Double
、Integer
等)。所有这些类型共享一个概念上的操作组:它们可以被加、乘、减、否定等。任何共享这些属性的类型都可以成为类型类的实例Num
。
有界类型
以某种方式有界的类型由不同的类型类表示:Bounded
. 在我的 GHCI 系统上,仅加载了默认模块,我看到Bounded
了Ordering
、Int
、Char
和Bool
. Int
受机器字的大小、Char
Unicode 标准的范围以及Bool
它们Ordering
的声明的限制所限制。
Double is not Bounded
,因为它能够表达无穷大(因此在概念上是无界的)。Integer
也不Bounded
是因为上限不一定是可确定的,也不是恒定的(它受可用内存的限制)。尽管如此,它们仍然能够表达数字类型的属性,因此Num
即使它们不是,它们仍然是Bounded
。
溢出
关于溢出,虽然已经显示Integer
不会溢出,Int
并且Word
(Bounded
通过它们在内存中的固定宽度表示)将溢出而没有警告或错误。在我的系统上,1 + maxBound :: Int
由于二进制补码而溢出到 minBound,尽管这不是保证行为。Word
溢出为 0,因为它是无符号数据类型。
请记住,Bounded
类型可能不会以“预期方式”溢出。Haskell 规范没有指定Bounded
类型应该如何溢出,所以它留给编译器设计者。请注意,这些数据类型的内部表示也未指定,因此不应假定二进制补码。实际上,即使 an 的大小Int
也只能保证为 29 位。
你有几种不相关的问题。
Integer
有点无界,这意味着它可以处理任何大小的数字(从技术上讲,它被底层库限制为非常大的东西(更准确地说是 2^(2^32)),你不会有任何问题。)所以没有“最大值”的真正概念Integer
。
类型类很重要,Num
因为可以添加、减去、具有绝对值等的所有内容都是 aNum
并且适用于所有在 . 上工作的函数Num
。因此,如果您需要编写一个使用这些操作之一的函数,它将适用于所有Num
s。所以,简而言之,Num
类型类很重要,因为所有类型类都很重要!