Optimization 解包严格字段与多态性的关系如何?
Optimization 解包严格字段与多态性的关系如何?,optimization,haskell,ghc,strict,algebraic-data-types,Optimization,Haskell,Ghc,Strict,Algebraic Data Types,{-#UNPACK}杂注告诉编译器消除冗余构造函数。引述: 例如,鉴于此: data T = T {-# UNPACK #-} !(Int,Float) GHC将表示T型,如下所示: data T = T Int Float 消除元组。这通常用于直接在构造函数中放置未绑定的int: data T = T {-# UNPACK #-} !Int 将被代表为 data T = T Int# 我想知道,当要解包的字段是多态的时,这也起作用吗?例如,如果我定义 data S' a = S S
{-#UNPACK}
杂注告诉编译器消除冗余构造函数。引述:
例如,鉴于此:
data T = T {-# UNPACK #-} !(Int,Float)
GHC将表示T型,如下所示:
data T = T Int Float
消除元组。这通常用于直接在构造函数中放置未绑定的int:
data T = T {-# UNPACK #-} !Int
将被代表为
data T = T Int#
我想知道,当要解包的字段是多态的时,这也起作用吗?例如,如果我定义
data S' a = S String {-# UNPACK #-} !a
type S1 = S' Int
newtype S2 = S2 (S' Int)
与S1
或S2
一起使用的函数是否会得到优化?引用Don关于解包的内容
这对于多态字段没有意义,因为它们的大小是可变的,并且编译器(除非在非常特殊的情况下)无法访问有关正在使用的类型的信息
你也可以阅读泰贝尔的邮件列表
不幸的是,解包不适用于多态字段(GHC head中针对无效解包pragmas的新警告应该对此发出警告)