【发布时间】:2018-03-06 20:56:45
【问题描述】:
元组的大小没有上限,但一些 Haskell 实现可能会限制元组的大小,并限制与较大元组关联的实例。然而,每个 Haskell 实现必须支持最大 15 的元组,以及 Eq、Ord、Bounded、Read 和 Show 的实例。 (...)
但是,众所周知,GHC 不支持大小大于 62 的元组。以下是我尝试在 GHCi 中创建大小为 63 的元组时发生的情况:
<interactive>:1:1: error:
A 63-tuple is too large for GHC
(max size is 62)
Workaround: use nested tuples or define a data type
我知道这符合 Haskell 98 规范,而且大小大于 62 的元组可能是非常不必要的,但我不明白为什么在 GHC 中就是这样。
总结一下:
- 为什么有元组大小限制?
- 为什么大小限制专门为 62?
另外:
- 为什么只有 GHC 6.12.2 及更高版本才会出现这种情况?
- 其他著名的 Haskell 实现是否这样做?他们的原因是什么?
【问题讨论】:
-
高基数元组在 Haskell 中并不经常使用,因为我们更喜欢使用结构(共)递归数据类型。我想不出我曾经使用过大于 3 元组的任何东西。这样做将是代码气味恕我直言。 GHC 的建议也是有效的,如果您真的需要超过 62 个字段的产品类型,那么值得自己定义一个
data记录。 -
为什么有大小限制,为什么是62?因为Manuel Chakravarty says 较大的元组会导致分段错误。早在 GHC 6 中,此限制不存在。弄清楚从那以后发生了什么会很有趣......
-
@AJFarmar 我认为 Alec 的评论包含比“此限制从 GHC 6.12.2 开始”更多的内容——它也是对您提出的问题的直接回答。 “为什么有元组大小限制?”为了避免段错误。 “为什么限制是62?”因为那是段错误开始的地方。 (事实上,我认为他应该将其发布为答案而不是评论!)
-
我在这里发现有趣的是,记录可以轻松拥有超过 62 个类型变量/字段。所以这意味着有一些核心方式,元组实际上不是我们总是被告知它们是的记录类型。这让我想知道(1)为什么和(2)我如何利用这种差异?
-
事后证明:有很多样板代码实例为所有元组大小(如Data.Binary)创建类实例,导致代码大小为 $O(n^2)$其中 $n$ 是最大元组大小。
标签: haskell compiler-errors tuples size compiler-specific