Optimization GHC中的嵌套解包 我经常在元组中收集多个值,因为我认为元组是这个类型的自然类型。然而,元组并不严格。所以考虑 data A data B = B !A data C = C !(B, B) data D = D !B !B

Optimization GHC中的嵌套解包 我经常在元组中收集多个值,因为我认为元组是这个类型的自然类型。然而,元组并不严格。所以考虑 data A data B = B !A data C = C !(B, B) data D = D !B !B,optimization,haskell,data-structures,ghc,Optimization,Haskell,Data Structures,Ghc,通过-funbox严格字段和优化,解包是嵌套的。C中的元组将像D一样解压到caa中,还是仅仅解压到cbb?以下是GHC文档中的参考: (非空元组类型?类型构造函数?考虑: 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在其第一个字段中

通过
-funbox严格字段
和优化,解包是嵌套的。
C
中的元组将像
D
一样解压到
caa
中,还是仅仅解压到
cbb
?以下是GHC文档中的参考:

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

考虑:

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

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



请注意,在这种样式中使用元组进行语法会产生开销——它们引入了一种必须优化的间接层次。因此,这有点不符合实际。

我修复了问题中的一个错误:数据B应该是数据B=B!所以在C中我应该使用我自己的特殊类型,它有严格的字段,而不是元组?我希望GHC在找到一个元组后可以继续解包,所以我不需要为每个字段编写很多专门的数据类型。(但是,由于我收集元组中的值,我可能对值集有一些抽象的概念,因此我可能应该使用一个专门的版本…)如果元组不是多态的,那会是这样。我之前已经写过这个问题:正如我从GHC文档中的示例中看到的,在数据类型中用作严格字段的对将被展平。