我在GHC.Prim中看到了以下代码:
...
negateFloat# :: Float# -> Float#
negateFloat# = let x = x in x
-- |Truncates a @Float#@ value to the nearest @Int#@.
-- Results are undefined if the truncation if truncation yields
-- a value outside the range of @Int#@.
float2Int# :: Float# -> Int#
float2Int# = let x = x in x
expFloat# :: Float# -> Float#
expFloat# = let x = x in x
logFloat# :: Float# -> Float#
logFloat# = let x = x in x
...
特别是:
float2Int#
甚至不应该输入检查let x = x
我知道扩展名为“MagicHash”,但它不能 神奇。是什么给了什么?
(我想我应该添加免责声明,我不知道-XMagicHash
实际上做了什么,我只是假设它允许#
语法,仅此而已。)
答案 0 :(得分:14)
线索位于模块的顶部:
{-
This is a generated file (generated by genprimopcode).
It is not code to actually be used. Its only purpose is to be
consumed by haddock.
-}
顺便提一下,let x = x in x
相当于undefined
,对任何数据类型都有效; x
不受自我引用以外的任何方式的约束,因此可以是任何类型。
这些函数是“原始的”意味着操作如此基本,它们没有在Haskell代码中定义,很可能只是直接转换为机器指令。