GHC Haskell公开了prim
包,其中包含未装箱值的定义,例如Int#
,Char#
等。
Int
,Char
等类型有何不同?一个假设是他们会更快,但为什么呢?答案 0 :(得分:11)
简单来说,类型Int
的值可能是未评估的表达式。在您“查看”该值之前,不会计算实际值。
类型Int#
的值是评估结果。总是
结果,一个Int
数据结构存在于堆上。 Int#
是......只是一个32位整数。它可以存在于CPU寄存器中。您可以使用一台机器指令对其进行操作。它几乎没有开销。
相比之下,当您编写x + 1
时,您实际上并不是计算 x + 1,而是在堆上创建一个数据结构,表示“当您想要计算这个,做x + 1“。
简单地说,Int#
更快,因为它不会是懒惰的。
什么时候应该使用它?几乎从不。这是编译器的工作。我们的想法是编写包含Int
和编译器的高级Haskell代码,找出可以用Int
替换Int#
的位置。 (我们希望!)如果没有,那么几乎总是更容易引入一些严格的注释,而不是直接使用Int#
。 (它也是不可移植的;只有GHC使用Int#
- 尽管目前还没有其他广泛使用的Haskell编译器。)