如何解压缩严格字段与多态性一起?

Pet*_*lák 14 optimization haskell strict ghc algebraic-data-types

{-# UNPACK #-}编译指示告诉编译器消除冗余构造函数.引用Haskell wiki:

例如,鉴于此:

data T = T {-# UNPACK #-} !(Int,Float)
Run Code Online (Sandbox Code Playgroud)

GHC将代表类型T,如下所示:

data T = T Int Float
Run Code Online (Sandbox Code Playgroud)

消除元组.这通常用于将未装箱的Int直接放在构造函数中:

data T = T {-# UNPACK #-} !Int
Run Code Online (Sandbox Code Playgroud)

将表示为

data T = T Int#
Run Code Online (Sandbox Code Playgroud)

我想知道,当要解压缩的字段是多态的时,这是否也有效?例如,如果我定义

data S' a   = S String {-# UNPACK #-} !a

type S1     = S' Int
newtype S2  = S2 (S' Int)
Run Code Online (Sandbox Code Playgroud)

将使用S1S2优化的功能?

Sat*_*vik 11

引用唐的博客关于拆包

对于多态字段没有意义,因为它们具有可变大小,并且编译器不能(除非在非常特定的情况下)访问有关正在使用的类型的信息.

您也可以阅读Tibell 对邮件列表的回复.

不幸的是,解压缩不适用于多态字段(GHC头部中无效解包编译指示的新警告应该警告这个)...