Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
GHC Haskell中的非固定值是什么?我们应该在什么时候使用它们?_Haskell_Ghc - Fatal编程技术网

GHC Haskell中的非固定值是什么?我们应该在什么时候使用它们?

GHC Haskell中的非固定值是什么?我们应该在什么时候使用它们?,haskell,ghc,Haskell,Ghc,GHC Haskell公开了prim包,其中包含未固定值的定义,如Int,Char等 它们与常规Haskell中的默认Int、Char等类型有何不同?假设它们更快,但为什么呢 什么时候应该使用这些替代品而不是盒装的常规替代品 使用装箱与未装箱值对程序有何影响 简单来说,Int类型的值可能是未计算的表达式。在“查看”该值之前,不会计算实际值 类型为Int#的值是一个计算结果。总是 因此,Int是一个位于堆上的数据结构。Int#是。。。只是一个32位整数。它可以存在于CPU寄存器中。您可以用一条机

GHC Haskell公开了
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在哪里或没有为您取消装箱类型