2012-10-27 26 views
14

{-# UNPACK #-}编译指示告诉编译器消除多余的构造函数。引述Haskell wiki严格字段如何解开多态性?

例如,给定此:

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工作功能进行优化?

回答

11

从唐的blog报价约拆包

它没有意义的多态领域,因为它们具有可变大小,编译器没有(除非是非常特殊的情况下)可以访问哪些类型的信息正在使用中。

此外,您可以阅读Tibell的reply到邮件列表。

不幸的是开箱多态字段(在GHC头应该警告无效的解压编译指示新的警告)不工作...