GHC中嵌套的UNPACK

tel*_*one 5 optimization haskell ghc data-structures

我经常在元组中收集多个值,因为我认为元组是这种元素的自然类型.但是,元组并不严格.考虑一下

data A

data B =
    B !A

data C =
    C !(B, B)

data D =
    D !B !B
Run Code Online (Sandbox Code Playgroud)

使用-funbox-strict-fields和优化,UNPACK是嵌套的.将在元组C被解压到C A A与D,或只C B B?以下是GHC-doc中的参考:7.16.实用主义.

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

Don*_*art 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
Run Code Online (Sandbox Code Playgroud)

哪里

data (,) a b = (a,b)
Run Code Online (Sandbox Code Playgroud)

GHC将很乐意擦除嵌套的严格构造函数(!B),它将在第一个字段中使C严格,优化为:

b0 = B 7
b1 = B 4

c = C b0 b1

d = D 7 4
Run Code Online (Sandbox Code Playgroud)

然而,重要的是,(,)它自身的领域并不严格 - 所以GHC无法解开它们.此外,它们是多态的,因此即使它们很严格也无法解压缩它们.

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


请注意,在此样式中使用元组作为语法会产生开销 - 它们会引入必须优化的间接级别.因此,它有点单一.