在这种情况下,UNPACK pragma 的作用是什么?

What does the UNPACK pragma do, in this case?

我无法理解 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))

?

GHC documentationUNPACK pragma的描述如下:

The UNPACK indicates to the compiler that it should unpack the contents of a constructor field into the constructor itself, removing a level of indirection.


How will datatype T be unpacked?

data T = T (P Int Int)对应

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

简而言之,UNPACK 已将构造函数 P 的内容解压到构造函数 T 的字段中,删除一级间接和一个构造函数头(P).

data T = T {-# UNPACK #-} !(P Int Int) 不像 "compact" 和 data T'' = T'' Int# Int#:


What about

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).

资源