2013-02-12 69 views
6

为什么这项工作为什么GHC打印15元组而不是16元组?

print (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True) 

,同时因为有Show例如15元组,这并不

print (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True) 
+3

对于你而言,比16元组更适合你的数据结构吗?这只是出于好奇? – AndrewC 2013-02-12 20:26:35

+1

@AndrewC我正在建模一个16位加法器 – cieplak 2013-02-17 22:41:00

回答

11

Prelude> :i (,,,,,,,,,,,,,,) 
data (,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o 
    = (,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o 
    -- Defined in `GHC.Tuple' 
<<skip>> 
instance (Read a, Read b, Read c, Read d, Read e, Read f, Read g, 
      Read h, Read i, Read j, Read k, Read l, Read m, Read n, Read o) => 
     Read (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) 
    -- Defined in `GHC.Read' 
instance (Show a, Show b, Show c, Show d, Show e, Show f, Show g, 
      Show h, Show i, Show j, Show k, Show l, Show m, Show n, Show o) => 
     Show (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) 
    -- Defined in `GHC.Show' 

而且没有16元组:

Prelude> :i (,,,,,,,,,,,,,,,) 
data (,,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o p 
    = (,,,,,,,,,,,,,,,) a b c d e f g h i j k l m n o p 
    -- Defined in `GHC.Tuple' 

请参阅docs

AFAIK实例在ghc内部库中是手写的,并且不太可能有人需要显示16元组。

+2

如果你对源代码感兴趣,数据类型是[here](http://www.haskell.org/ghc/docs/7.0.4/html/libraries/ ghc-prim-0.2.0.0/src/GHC-Tuple.html),Read实例是[here](http://hackage.haskell.org/packages/archive/base/3.0.1.0/doc/html/src /GHC-Read.html#line-555),Show实例是[here](http://hackage.haskell.org/packages/archive/base/3.0.3.2/doc/html/src/GHC-Show html的#线216)。显然,如果你做了太多的这些定义,GHC最终会出现段错误,所以它必须在某个地方结束。 – 2013-02-12 03:23:13

+0

@JeffreyBurka谢谢。我试图在文档中找到基于hackage的最新三个版本的源代码,但指向'GHC.Show'的链接不起作用。 Re'GHC.Tuple':我尝试了850元组,'ghci'知道所有这些。 – Yuras 2013-02-12 03:35:07

+0

所以它确实如此。那些不能在任何地方定义,所以那里发生了什么? – 2013-02-12 03:44:30

7

这在Haskell的报告Section 6.1.4 Tuples定义:

上有一个元组的尺寸没有上限,但一些Haskell的实现可以限制的元组的大小,和限制与较大的元组相关联的情况下。但是,每个Haskell实现都必须支持最大大小为15的元组,以及Eq,Ord,Bounded,Read和Show的实例。 Prelude和库定义了元组函数,例如zip,用于元组大小最大为7的元组。

相关问题