我经常在元组中收集多个值,因为我认为元组是这种情况的自然类型。但是,元组并不严格。所以考虑
data A
data B =
B !A
data C =
C !(B, B)
data D =
D !B !B
通过-funbox-strict-fields和优化,UNPACK 是嵌套的。中的元组会C被解压缩成C A AwithD还是 just C B B?这是 GHC-doc 中的参考:7.16。语用。
(是非空元组类型吗?类型构造函数?)
我经常在元组中收集多个值,因为我认为元组是这种情况的自然类型。但是,元组并不严格。所以考虑
data A
data B =
B !A
data C =
C !(B, B)
data D =
D !B !B
通过-funbox-strict-fields和优化,UNPACK 是嵌套的。中的元组会C被解压缩成C A AwithD还是 just C B B?这是 GHC-doc 中的参考:7.16。语用。
(是非空元组类型吗?类型构造函数?)
考虑:
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 无法解压它们。此外,它们是多态的,因此即使它们是严格的也无法解包它们。
第一部分的解决方法是使用严格的元组。第二部分的解决方法是使用自特化元组(例如,特化元组的类型族)。
请注意,在这种样式中使用元组作为语法会产生开销——它们引入了必须优化掉的间接级别。因此,它有点单调。