{ - #UNPACK# - }在GHC Haskell中输入#的区别?

时间:2017-01-03 18:54:42

标签: haskell ghc

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

例如,有什么区别:

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

data T = T Int#

2 个答案:

答案 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附近)。