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