【问题标题】:Difference between {-# UNPACK #-} Type# in GHC Haskell?GHC Haskell 中 {-# UNPACK #-} Type# 的区别?
【发布时间】:2017-01-03 18:54:41
【问题描述】:

在 GHC 中,{-# UNPACK #-} pragma 和 # 类型后缀运算符有什么区别?

例如,有什么区别:

data T = T {-# UNPACK #-} Int

data T = T Int#

【问题讨论】:

  • Int# 不是“Int 最后带有一些一元运算符#”。 Int# 是一个类型的名称,真的Int 没有任何关系(就类型系统而言)。
  • 请注意,UNPACK 变体的Int 之前缺少!
  • 如果我读的是docs对的话,这些没有区别。
  • @Cubic:很公平。但在这种情况下,类型 Int# 被定义。 {-# UNPACK #-} !IntInt#之间还有区别吗?一般的区别仅仅是{-# UNPACK #-}可以用于任何类型,而Type#只能用于有限的类型列表,包括Int#
  • 不过,总的来说,UNPACK 更强大,因为它可以自动扁平化更复杂的数据结构。

标签: haskell ghc


【解决方案1】:

如你所知,来自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 才能引用这些名称。

【讨论】:

    【解决方案2】:

    也许说得太明显了,但主要区别在于,在第一种情况下,构造函数将具有类型

    T :: Int -> T
    

    在第二种情况下

    T :: Int# -> T
    

    就运行时表示而言,没有区别(除了我认为如果禁用优化,UNPACK 会被忽略)。因此,以T {-# UNPACK #-} !Int 为例,模式匹配case t of T n -> ... 必须为n 创建一个新的I# 框(希望将与附近的另一个case 取消)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多