I was looking for the definition of seq
and came across this weirdness. Why do all these functions have the same/similar definitions?
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
There are many more with this definition in the source code. What's going on?
What's going on is that these functions cannot be implemented in Haskell, but they should appear in the docs. Since
haddock
needs a syntactically correct (and well-typed) definition for each signature, the source must contain dummy definitions. Further, at the point where they are defined (in theghc-prim
package),error
(and henceundefined
) are not yet available, so the more obviousseq = error "Not implementable in Haskell"
can't be used, thus the circular definition.These definitions are a ruse: they're provided primitively by the GHC runtime. It turns out that the infinite loop
let x = x in x
can be given any type, so it's as good a ruse definition as any.