5

我经常在元组中收集多个值,因为我认为元组是这种情况的自然类型。但是,元组并不严格。所以考虑

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。语用

(是非空元组类型吗?类型构造函数?)

4

1 回答 1

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 无法解压它们。此外,它们是多态的,因此即使它们是严格的也无法解包它们。

第一部分的解决方法是使用严格的元组。第二部分的解决方法是使用自特化元组(例如,特化元组的类型族)。


请注意,在这种样式中使用元组作为语法会产生开销——它们引入了必须优化掉的间接级别。因此,它有点单调。

于 2012-04-18T20:34:48.720 回答