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

时间:2012-10-27 08:01:19

标签: optimization haskell ghc strict algebraic-data-types

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

  

例如,鉴于此:

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)

是否会优化与S1S2一起使用的功能?

1 个答案:

答案 0 :(得分:11)

引用Don的blog关于解包的信息

  

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

您也可以阅读Tibell的reply到邮件列表。

  

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