在尝试学习Haskell时,出现的困难之一是当某些东西需要编译器的特殊魔术时的能力。想到的一个例子是seq
函数,该函数无法定义,即您无法使seq2
函数的行为与内置seq
完全相同。因此,当教某人有关seq
时,您需要提到seq
是特殊的,因为它是编译器的特殊符号。
另一个示例是do
-注释,该注释仅适用于Monad
类的实例。
有时,这并不总是显而易见的。例如,延续。编译器是否了解Control.Monad.Cont
还是您本可以自己发明的纯朴的Haskell?在这种情况下,我认为即使延续是一种非常奇怪的野兽,编译器也不需要任何特殊的东西。
撇开语言扩展,Haskell学习者还应该注意其他哪些编译器魔术?
最佳答案
几乎所有无法在用户环境中实现的ghc原语都在ghc-prim包中。 (它甚至还有一个名为GHC.Magic
的模块!)
因此,浏览它会带来很好的感觉。
请注意,除非您确切知道自己在做什么,否则不应在用户区代码中使用此模块。大部分可用的东西都以base
有时以修改的形式导出到下游模块中。这些下游位置和API被认为更稳定,而ghc-prim
不保证其在版本之间的行为。
GHC特定的内容在 GHC.Exts
中被重新导出,但是Prelude中还有很多其他内容(例如基本数据类型以及seq
)或并发库等。