14

{-# UNPACK #-}pragma 告诉编译器消除多余的构造函数。引用Haskell 维基

例如,鉴于此:

data T = T {-# UNPACK #-} !(Int,Float)

GHC 将像这样表示类型 T:

data T = T Int Float

消除元组。这通常用于将未装箱的 Ints 直接放入构造函数中:

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优化的功能吗?

4

1 回答 1

11

引用 Don 的关于解包的博客

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

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

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

于 2012-10-27T08:16:01.677 回答