在 GHC 中,{-# UNPACK #-}
杂注和#
类型后缀运算符有什么区别?
例如,两者之间有什么区别:
data T = T {-# UNPACK #-} Int
和
data T = T Int#
如您所知,从这里:
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
来引用这些名称。
也许说起来太明显了,但主要区别在于在第一种情况下,构造函数将具有类型
T :: Int -> T
在第二种情况下
T :: Int# -> T
就运行时表示而言,不会有任何区别(除了我认为如果禁用优化UNPACK
会被忽略)。因此,在T {-# UNPACK #-} !Int
的情况下,例如,模式匹配case t of T n -> ...
必须为n
创建一个新的I#
框(希望该框会随着附近的另一个case
而取消)。