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 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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With