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的新警告应该对此发出警告)