我经常在元组中收集多个值,因为我认为元组是这种元素的自然类型。但是,元组并不严格。所以考虑一下
data A
data B =
B !A
data C =
C !(B, B)
data D =
D !B !B
使用-funbox-strict-fields
和优化,UNPACK是嵌套的。 C
中的元组是否会像C A A
一样被解压缩到D
,或只是C B B
?以下是GHC-doc中的参考:7.16. Pragmas。
(非空元组类型?type-constructors?)
答案 0 :(得分:6)
考虑:
data B = B !Int
data C = C !(B, B)
data D = D !B !B
b0 = B 7
b1 = B 4
c = C (b0, b1)
d = D b0 b1
其中
data (,) a b = (a,b)
GHC会愉快地删除嵌套的严格构造函数(!B)
,它会在第一个字段中使C严格,优化为:
b0 = B 7
b1 = B 4
c = C b0 b1
d = D 7 4
然而,重要的是,(,)
本身的字段并不严格 - 所以GHC无法解压缩它们。此外,它们是多态的,所以即使它们很严格也无法解压缩。
第一部分的解决方法是使用严格的元组。第二部分的解决方法是使用self-specializing tuples(例如,键入专门化元组的系列)。
请注意,在此样式中使用元组语法会产生开销 - 它们会引入必须优化的间接级别。因此,它有点单一。