gpt4 book ai didi

haskell - 为什么 Int 类型 2^31 不会超出 GHCi 的范围?

转载 作者:行者123 更新时间:2023-12-03 14:57:40 25 4
gpt4 key购买 nike

我正在阅读 Programming in Haskell book 和 testing 在 GHCi 解释器中提供了示例。事实证明,Int 中存在差异。 GHCi 和 Hugs 解释器中的类型行为。根据“Haskel 编程”的第 3 章,2^31 :: Int应该超出 Int 的范围类型。同时,在 GHCi 解释器中,我得到:

Prelude> 2^31 :: Int
2147483648

而在 Hugs 中,它的行为就像书中所说:
Hugs> 2^31 :: Int
-2147483648

在 GHCi 中,我什至可以检查结果是否为 Int 类型。
Prelude> let x = 2^31 :: Int
Prelude> :type x
x :: Int
Prelude> x
2147483648

所描述的差异的根源是什么?我应该在 Hugs 中运行书中的示例还是使用 GHCi,这似乎是学习 Haskell 的推荐选择?我会很感激你的帮助。

最佳答案

一个 Int在 Haskell 中必须至少支持 [-2^29 .. 2^29-1] 的范围, 但也可以更大。确切的大小将取决于您使用的编译器和您所在的架构。 (您可以在 2010 Haskell Report 中了解更多信息,这是 Haskell 语言的最新标准。)

在 64 位机器上使用 GHC,您将拥有 [-2^63..2^63 - 1] 的范围.但即使在 32 位机器上,我相信 GHC 给你的范围也会比严格的最小值大一点(大概是 [-2^31..2^31 - 1] )。

您可以使用 maxBound 查看实际界限。和 minBound :

> maxBound :: Int
9223372036854775807

实现之间的差异出现是因为语言定义明确允许它们以不同的方式实现这些类型。就个人而言,我会继续使用 GHCi记住这一点,因为 GHC是迄今为止您最有可能使用的编译器。如果您遇到更多的不一致,您可以在标准中查找它们或询问某人(就像这里一样!);将其视为一种学习经历;)。

该标准在这方面很灵活,允许不同的编译器和架构以不同的方式优化其代码。我假设(但不是 100% 确定)最小范围是在考虑 32 位系统的情况下给出的,同时还让编译器将底层 32 位值中的几位用于其内部目的,例如轻松区分来自指针的数字。 (至少我知道 Python 和 OCaml 会这样做。)GHC 不需要这样做,因此它会根据其架构公开完整的 32 位或 64 位。

关于haskell - 为什么 Int 类型 2^31 不会超出 GHCi 的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26919727/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com