在GHC中,{-# UNPACK #-}
pragma和#
类型后缀运算符之间有什么区别?
例如,有什么区别:
data T = T {-# UNPACK #-} Int
和
data T = T Int#
答案 0 :(得分:3)
如您所知,来自here:
UNPACK
向编译器指示它应该解压缩 构造函数字段的内容放入构造函数本身,删除 间接水平
Int#
是GHC未装箱的Int类型的名称。 Int
只是这种类型的包装。
Prelude> import GHC.Int
Prelude GHC.Int> :info Int
data Int = I# GHC.Prim.Int# -- Defined in ‘GHC.Types’
哈希只是没有堆表示的未装箱类型的命名约定。您需要启用扩展程序-XMagicHash
来引用这些名称。
答案 1 :(得分:1)
也许这说得太明显但主要区别在于,在第一种情况下,构造函数将具有类型
T :: Int -> T
在第二种情况下
T :: Int# -> T
就运行时表示而言,没有区别(除非我认为如果禁用优化,则忽略UNPACK
)。因此,例如,在T {-# UNPACK #-} !Int
的情况下,模式匹配case t of T n -> ...
必须为I#
创建一个新的n
框(有望取消另一个case
附近)。