浏览前奏的源代码会带来奇怪的现象

The*_*kle 15 haskell standard-library ghc

我正在寻找定义,seq并遇到了这种奇怪.为什么所有这些函数都有相同/相似的定义?

seq :: a -> b -> b
seq = let x = x in x

inline :: a -> a
inline = let x = x in x    

lazy :: a -> a
lazy = let x = x in x
Run Code Online (Sandbox Code Playgroud)

源代码中有更多此定义.这是怎么回事?

Dan*_*her 21

发生的事情是这些函数无法在Haskell中实现,但它们应该出现在文档中.由于haddock需要每个签名的语法正确(和良好类型)定义,因此源必须包含虚拟定义.此外,在它们被定义的位置(在ghc-prim包中),error(并因此undefined)尚不可用,因此seq = error "Not implementable in Haskell"不能使用更明显,因此是圆形定义.

  • `error`被定义为`throw(ErrorCall message)`,因此你需要`Exception`机制和`Typeable`.据我所知,它可以直接使用`raise #`原语定义在`Exception`框架之外,但是让它适应另一个`Exception`s更好.所以为了保持`ghc-prim`小,只提供`raise #`,更精细的东西进入`base`.简而言之,它可以更早地定义,但它不是那么好,并且没有充分的理由去做它,`GHC.Prim`来源无论如何都是一个未使用的虚拟对象. (3认同)

Dan*_*ner 9

这些定义是一个诡计:它们由GHC运行时原始提供.事实证明,无限循环let x = x in x可以被赋予任何类型,因此它与任何类型一样好.