GHC Haskell中的非固定值是什么?我们应该在什么时候使用它们?
GHC Haskell公开了GHC Haskell中的非固定值是什么?我们应该在什么时候使用它们?,haskell,ghc,Haskell,Ghc,GHC Haskell公开了prim包,其中包含未固定值的定义,如Int,Char等 它们与常规Haskell中的默认Int、Char等类型有何不同?假设它们更快,但为什么呢 什么时候应该使用这些替代品而不是盒装的常规替代品 使用装箱与未装箱值对程序有何影响 简单来说,Int类型的值可能是未计算的表达式。在“查看”该值之前,不会计算实际值 类型为Int#的值是一个计算结果。总是 因此,Int是一个位于堆上的数据结构。Int#是。。。只是一个32位整数。它可以存在于CPU寄存器中。您可以用一条机
prim
包,其中包含未固定值的定义,如Int
,Char
等
- 它们与常规Haskell中的默认
、Int
等类型有何不同?假设它们更快,但为什么呢Char
- 什么时候应该使用这些替代品而不是盒装的常规替代品
- 使用装箱与未装箱值对程序有何影响
Int
类型的值可能是未计算的表达式。在“查看”该值之前,不会计算实际值
类型为Int#
的值是一个计算结果。总是
因此,Int
是一个位于堆上的数据结构。Int#
是。。。只是一个32位整数。它可以存在于CPU寄存器中。您可以用一条机器指令对其进行操作。它几乎没有开销
相反,当你写,比如说,x+1
,你实际上并不是在计算x+1,而是在堆上创建了一个数据结构,上面写着“当你想计算这个时,做x+1”
简单地说,Int#
更快,因为它不能懒惰
你应该什么时候使用它?几乎从来没有。这是编译器的工作。这样做的目的是编写涉及
Int
的高级Haskell代码,编译器会找出在哪里可以用Int
替换Int
。(我们希望!)如果不这样做,那么加入一些严格的注释几乎总是比直接使用Int
更容易。(它也是不可移植的;只有GHC使用Int
——尽管目前还没有其他广泛使用的Haskell编译器。)我已经写过这方面的文章,你可能想尝试一下。几天前,我比较了Int
s(经过严格评估)和Int
的性能。当使用-O2
编译时,性能几乎没有差别。GHC做得很好。您可以查看生成的核心,看看GHC在哪里或没有为您取消装箱类型