Haskell元组大小限制

时间:2010-06-04 23:27:13

标签: haskell tuples

为什么我不能在Haskell中构造大元组?为什么有元组大小限制?

Prelude> (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1)

<interactive>:1:0:
    No instance for (Show
                       (t,
                        t1,
                        t2,
                        ...
                        t23))
      arising from a use of `print' at <interactive>:1:0-48
    Possible fix:
      add an instance declaration for
      (Show
         (t,
          t1,
          t2,
          ...
          t23))
    In a stmt of a 'do' expression: print it

3 个答案:

答案 0 :(得分:23)

在Haskellers中很多人感叹,元组不是成分。因此,必须在每个元组大小上定义任何类型类。我认为报告说实例只需要定义10个或类似的东西。

我在练习中从不使用超过三倍。如果您使用元组来执行某种类型级逻辑,请构建组合变体并使用它。例如:

infixr 9 :*
data a :* b = a :* !b

那么5个Ints的类型将是:

Int :* Int :* Int :* Int :* Int :* ()

最后的单元()对于类型级逻辑和严格性正确性很重要(你不希望最后一个元素是严格的而所有其他元素都是惰性的。)

请注意声明中的爆炸声。这意味着元组的右侧是严格的,因此像上面的5ple这样的类型可以平坦化为单个内存块,因此后来的元素访问的成本并不比之前的元素贵。

答案 1 :(得分:21)

元组可以是任意长度*,但Show,以及Eq,Ord,Read,Bounded等仅实例化为15元组。来自Haskell 98 report §6.1.4

  

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

正如其他人所说,如果你需要一个24元组,你应该使用更好的数据结构。


编辑:*自GHC 6.12.2起,元组的最大大小为62:

Prelude> :t (1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8,1,2,3,4,5,6,7,8)

<interactive>:1:0:
    A 64-tuple is too large for GHC
      (max size is 62)
      Workaround: use nested tuples or define a data type

答案 2 :(得分:11)

您可以构建更大的元组,但您需要自己定义它们。其次,您没有Show实例,因此您还需要为此编写实例。

通常,当您应该使用更智能的数据类型(如向量)时,使用大元组是一个坏主意。我们通过限制默认提供的大小来阻止使用。