什么是GHC Haskell中的未装箱值,我们何时应该使用它们?

时间:2014-11-28 17:14:33

标签: haskell ghc

GHC Haskell公开了prim包,其中包含未装箱值的定义,例如Int#Char#等。

  • 它们与常规Haskell中的默认IntChar等类型有何不同?一个假设是他们会更快,但为什么呢?
  • 何时应该使用这些而不是盒装常规替代品?
  • 使用盒装vs未装箱的值如何影响程序?

1 个答案:

答案 0 :(得分:11)

简单来说,类型Int的值可能是未评估的表达式。在您“查看”该值之前,不会计算实际值。

类型Int#的值是评估结果。总是

结果,一个Int数据结构存在于堆上。 Int#是......只是一个32位整数。它可以存在于CPU寄存器中。您可以使用一台机器指令对其进行操作。它几乎没有开销。

相比之下,当您编写x + 1时,您实际上并不是计算 x + 1,而是在堆上创建一个数据结构,表示“当您想要计算这个,做x + 1“。

简单地说,Int#更快,因为它不会是懒惰的。

什么时候应该使用它?几乎从不。这是编译器的工作。我们的想法是编写包含Int编译器的高级Haskell代码,找出可以用Int替换Int#的位置。 (我们希望!)如果没有,那么几乎总是更容易引入一些严格的注释,而不是直接使用Int#。 (它也是不可移植的;只有GHC使用Int# - 尽管目前还没有其他广泛使用的Haskell编译器。)