我无法理解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))
答案 0 :(得分:23)
GHC documentation描述了UNPACK
pragma如下:
UNPACK
向编译器指示它应该将构造函数字段的内容解包到构造函数本身中,从而删除间接级别。
如何解压缩数据类型
T
?
data T = T (P Int Int)
对应
因此,data T = T {-# UNPACK #-} !(P Int Int)
对应
简单地说,UNPACK
已将构造函数P
的内容解压缩到构造函数T
的字段中,删除了一个间接层和一个构造函数头(P
)
data T = T {-# UNPACK #-} !(P Int Int)
不像data T'' = T'' Int# Int#
那样“紧凑”:
怎么样?
data U = U {-# UNPACK #-} !(P Int (P Int Int))
同样,data U = U (P Int (P Int Int))
对应
和data U = U {-# UNPACK #-} !(P Int (P Int Int))
对应
用简单的英语,UNPACK
已将构造函数P
的内容解压缩到构造函数U
的字段中,删除了一个间接层和一个构造函数头(P
)