在这种情况下,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 documentation对UNPACK
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
).
资源
我无法理解 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 documentation对UNPACK
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
).