在这种情况下,UNPACK pragma做了什么?

时间:2015-11-26 06:34:15

标签: haskell indirection

我无法理解UNPACK在Haskell中的工作原理。 例如,考虑以下数据声明:

data P a b = P !a !b
data T = T {-# UNPACK #-} !(P Int Int)

如何解压缩数据类型T?它是否等同于

data T' = T' !Int !Int

或将Int进一步解压缩:

data T'' = T'' Int# Int#

怎么样?
data U = U {-# UNPACK #-} !(P Int (P Int Int))

1 个答案:

答案 0 :(得分:23)

GHC documentation描述了UNPACK pragma如下:

  

UNPACK向编译器指示它应该将构造函数字段的内容解包到构造函数本身中,从而删除间接级别。

  

如何解压缩数据类型T

data T = T (P Int Int)对应

non-unpacked data

因此,data T = T {-# UNPACK #-} !(P Int Int)对应

pair unpacked

简单地说,UNPACK已将构造函数P的内容解压缩到构造函数T的字段中,删除了一个间接层和一个构造函数头(P

data T = T {-# UNPACK #-} !(P Int Int)不像data T'' = T'' Int# Int#那样“紧凑”:

completely unpacked

  

怎么样?
data U = U {-# UNPACK #-} !(P Int (P Int Int))
     

同样,data U = U (P Int (P Int Int))对应

pair of pairs

data U = U {-# UNPACK #-} !(P Int (P Int Int))对应

unpacked pair of pairs

用简单的英语,UNPACK已将构造函数P的内容解压缩到构造函数U的字段中,删除了一个间接层和一个构造函数头(P

资源