Haskell元组大小限制

Min*_*ang 18 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
Run Code Online (Sandbox Code Playgroud)

luq*_*qui 23

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

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

infixr 9 :*
data a :* b = a :* !b
Run Code Online (Sandbox Code Playgroud)

那么5个Ints的类型将是:

Int :* Int :* Int :* Int :* Int :* ()
Run Code Online (Sandbox Code Playgroud)

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

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


ken*_*ytm 22

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

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

正如其他人所说,如果你需要一个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
Run Code Online (Sandbox Code Playgroud)


Don*_*art 11

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

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