为什么GHC打印15元组而不是16元组?

cie*_*lak 6 haskell

为什么这样做

print (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True)
Run Code Online (Sandbox Code Playgroud)

虽然这不是

print (True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True)
Run Code Online (Sandbox Code Playgroud)

Yur*_*ras 11

因为有Show15元组的实例:

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'
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

查看文档

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

  • 如果您对源代码感兴趣,那么数据类型是[here](http://www.haskell.org/ghc/docs/7.0.4/html/libraries/ghc-prim-0.2.0.0/src/GHC- Tuple.html),Read实例是[这里](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#line-216).显然,如果你做了太多这些定义,那么GHC最终会出现段错误,所以它必须在某个地方结束. (2认同)

Pet*_*lák 7

这在Haskell Report Section 6.1.4元组中定义:

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