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.实用主义.
(是非空元组类型?类型构造函数?)
考虑:
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无法解开它们.此外,它们是多态的,因此即使它们很严格也无法解压缩它们.
第一部分的解决方法是使用严格的元组.第二部分的解决方法是使用自专业元组(例如,专门化元组的类型族).
请注意,在此样式中使用元组作为语法会产生开销 - 它们会引入必须优化的间接级别.因此,它有点单一.