GHC.Prim中的可疑代码

时间:2014-02-13 22:54:35

标签: haskell ghc

我在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

...

特别是:

  1. float2Int#甚至不应该输入检查
  2. 没有一个函数采用参数,因此似乎格式不正确
  3. 这些功能都不适用于他们声称的数学运算
  4. 所有功能都是“无限递归”:let x = x
  5. 我知道扩展名为“MagicHash”,但它不能 神奇。是什么给了什么?

    (我想我应该添加免责声明,我不知道-XMagicHash 实际上做了什么,我只是假设它允许#语法,仅此而已。)

1 个答案:

答案 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代码中定义,很可能只是直接转换为机器指令。