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

Jak*_*old 6 haskell ghc

GHC Haskell的暴露prim包,其中包含装箱值的定义,如Int#,Char#

  • 他们如何与缺省值不同Int,Char等等,类型普通的Haskell?一个假设是它们更快,但为什么呢?
  • 什么时候应该使用这些而不是盒装常规替代品?
  • 使用盒装与未装箱的价值如何影响该计划?

Mat*_*hid 11

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

type的值Int#是评估结果.总是.

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

相比之下,当你写,比如说,x + 1你实际上并没有计算 x + 1时,你在堆上创建了一个数据结构,上面写着"当你想要计算它时,做x + 1".

简单地说,Int#速度更快,因为它不能偷懒.

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

  • 几天前,我比较了`Int`s(严格评估)和'Int #`的表现.当使用`-O2`编译时,性能上没有差别*.GHC做得很好. (4认同)