2011-12-28 32 views
15

我正在寻找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 

这个定义在源代码中还有很多。这是怎么回事?

回答

21

发生什么事是这些函数不能在Haskell中实现,但它们应该出现在文档中。由于haddock需要每个签名的语法正确(以及良好类型)定义,所以源必须包含伪定义。此外,在它们被定义的地方(在ghc-prim包中),error(因此undefined)尚不可用,所以更明显的seq = error "Not implementable in Haskell"不能使用,因此是循环定义。

+1

有没有原因'错误'*不能*早于'seq'和朋友定义? – 2011-12-28 21:11:47

+3

'error'被定义为'throw(ErrorCall message)',所以你需要'Exception'机制和'Typeable'。据我所知,它可以在'Exception'框架之外定义,直接使用'raise#'原语,但更适合与其他'Exception's匹配。所以为了保持'ghc-prim'小,只提供'raise#',更复杂的东西进入'base'。简而言之,它可以被定义得更早,但它不是很好,也没有理由去做,GHC.Prim来源将是一个未使用的假人。 – 2011-12-28 22:19:04

9

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