Прохождение исходного кода для прелюдии вызывает странность

Я искал определение 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

В исходном коде есть еще много этого определения. Что происходит?

Ответы

Ответ 1

Что происходит, так это то, что эти функции не могут быть реализованы в Haskell, но они должны появиться в документах. Поскольку haddock требуется синтаксически правильное (и хорошо типизированное) определение для каждой сигнатуры, источник должен содержать фиктивные определения. Кроме того, в точке, где они определены (в пакете ghc-prim), error (и, следовательно, undefined) еще недоступны, поэтому более очевидный seq = error "Not implementable in Haskell" не может быть использован, таким образом, круговое определение.

Ответ 2

Эти определения являются уловкой: они обеспечиваются примитивно с помощью среды выполнения GHC. Оказывается, что бесконечный цикл let x = x in x может быть задан любым типом, так что это хорошее определение рутинга как любое.