Int如何在Haskell中实际定义?

Enr*_*lla 5 haskell

了解你的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代码定义?

Aar*_*iel 5

Int是魔法 - 由编译器定义。正如其他作者所说,它实际上并未定义为代数数据类型,而是实现定义的,很像Double!

但是有一些规则,Int保证至少是 30 位有符号整数。Int必须能够表达范围内的每个值[-2^29, 2^29)(不包括上限)。实际上,Int由编译器定义为等效于 32 位整数值。这样做的原因是它Int可以以机器字不能的某些方式进行优化。指针标记对于 Haskell 性能很重要,因此实现可以自由使用一些位。

如果您想要保证大小的值,Data.InthasInt32Data.Wordhas Word32,它们保证与 32 位有符号和无符号机器整数完全对应。


bit*_*app 2

http://hackage.haskell.org/package/base-4.6.0.1/docs/src/GHC-Int.html#Int8

上面是大小(我相信有符号)的 Int 数据类型,但默认Int是内置的。

他提出了关于代数数据类型如何编码“精确”类型的观点,这些类型概述了该类型的成员是什么。从某些方面来说,这是从依赖类型中删除的一个步骤,但那又是另一回事了。