Reputation: 7294
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?
Upvotes: 15
Views: 516
Reputation: 183868
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 the ghc-prim
package), error
(and hence undefined
) are not yet available, so the more obvious seq = error "Not implementable in Haskell"
can't be used, thus the circular definition.
Upvotes: 21
Reputation: 152707
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.
Upvotes: 9