Прохождение исходного кода для прелюдии вызывает странность - PullRequest
15 голосов
/ 28 декабря 2011

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

Есть много других с этим определением в исходном коде.Что происходит?

Ответы [ 2 ]

21 голосов
/ 28 декабря 2011

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

9 голосов
/ 28 декабря 2011

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

...