GHC Haskell 中的 {-# UNPACK #-} Type# 之间的区别



在 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而取消)。

相关内容

  • 没有找到相关文章

最新更新