Прохождение исходного кода для прелюдии вызывает странность
Я искал определение 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
может быть задан любым типом, так что это хорошее определение рутинга как любое.