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

时间:2013-02-12 02:31:36

标签: haskell

为什么这样做

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

虽然这不是

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

2 个答案:

答案 0 :(得分:11)

因为15元组有Show个实例:

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元组。

答案 1 :(得分:7)

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

  

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