Int如何在Haskell中实际定义?

时间:2014-02-22 19:09:53

标签: haskell

MiranLipovača撰写的 Learn You A Haskell for Great Good! 一书在 Making Our Own Types and Typeclasses 一章中说,Haskell的Int类型的概念可以这样表示:< / p>

data Int = -2147483648 | -2147483647 | ... | -1 | 0 | 1 | 2 | ... | 2147483647  

然而,它表示它只是作为示范目的,但它没有说明Int是如何实际定义的。 Int是由编译器特别定义的,还是可以用普通的Haskell代码定义?

3 个答案:

答案 0 :(得分:3)

可以在Haskell中通过实际定义所有2 ^ 32个构造函数(不能被称为12等来定义,因为它们不是合法的构造函数名称)然后定义{ {1}}恰当。然而,这不太实际。

在所有实际实施中,fromInteger都是内置的。

答案 1 :(得分:3)

Int很神奇 - 由编译器定义。正如其他作者所说,它实际上并没有被定义为代数数据类型,它是实现定义的,就像Double

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

如果您希望保证大小有限的值,Data.IntInt32Data.WordWord32,这可以保证与32位有符号和无符号机器整数完全对应。< / p>

答案 2 :(得分:2)

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

以上是大小(我相信已签名)的Int数据类型,但默认的Int是内置的。

他正在指出代数数据类型如何编码“精确”类型,以概述该类型的成员是什么。这在某些方面是从依赖打字中移除的一步,但这是另一个鱼的水壶。