在了解你的Haskell的大好事!MiranLipovača的书在" Make Our Own Types"和"Typeclasses "一章中说,Haskell的Int类型的概念可以表示如下:
data Int = -2147483648 | -2147483647 | ... | -1 | 0 | 1 | 2 | ... | 2147483647
Run Code Online (Sandbox Code Playgroud)
尽管如此,它说它只是作为示范目的起作用,但它没有说明Int是如何实际定义的.Int是由编译器特别定义的,还是可以用普通的Haskell代码定义?
Int
是魔法 - 由编译器定义。正如其他作者所说,它实际上并未定义为代数数据类型,而是实现定义的,很像Double
!
但是有一些规则,Int
保证至少是 30 位有符号整数。Int
必须能够表达范围内的每个值[-2^29, 2^29)
(不包括上限)。实际上,Int
由编译器定义为等效于 32 位整数值。这样做的原因是它Int
可以以机器字不能的某些方式进行优化。指针标记对于 Haskell 性能很重要,因此实现可以自由使用一些位。
如果您想要保证大小的值,Data.Int
hasInt32
和Data.Word
has Word32
,它们保证与 32 位有符号和无符号机器整数完全对应。
http://hackage.haskell.org/package/base-4.6.0.1/docs/src/GHC-Int.html#Int8
上面是大小(我相信有符号)的 Int 数据类型,但默认Int
是内置的。
他提出了关于代数数据类型如何编码“精确”类型的观点,这些类型概述了该类型的成员是什么。从某些方面来说,这是从依赖类型中删除的一个步骤,但那又是另一回事了。