为什么我不能在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
答案 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实例,因此您还需要为此编写实例。
通常,当您应该使用更智能的数据类型(如向量)时,使用大元组是一个坏主意。我们通过限制默认提供的大小来阻止使用。