23

我很难理解UNPACKHaskell 的工作原理。例如,考虑以下数据声明:

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

数据类型T将如何解包?是否相当于

data T' = T' !Int !Int

还是将Ints 进一步解包:

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

? 关于什么

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

?

4

1 回答 1

28

GHC 文档对pr​​agma的描述UNPACK如下:

向编译器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)。

资源

于 2015-11-26T07:55:29.113 回答