http://hackage.haskell.org/package/base-4.6.0.1/docs/src/GHC-Base.html#assert, похоже, определяет assert
как no-op. Где логика, которая превращает это во что-то другое, когда утверждения разрешены?
Где утверждают магические правила для GHC?
Ответ 1
Комментарий выше этой функции дает подсказку:
-- Assertion function. This simply ignores its boolean argument.
-- The compiler may rewrite it to @('assertError' line)@.
Итак, просто используйте поиск кода github и найдите assertError
: результаты поиска
Появится файл RnExpr.lhs. Поиск утверждения в этом файле, вы найдете следующий код:
finishHsVar :: Name -> RnM (HsExpr Name, FreeVars)
-- Separated from rnExpr because it also used
-- when renaming infix expressions
-- See Note [Adding the implicit parameter to 'assert']
finishHsVar name
= do { this_mod <- getModule
; when (nameIsLocalOrFrom this_mod name) $
checkThLocalName name
; ignore_asserts <- goptM Opt_IgnoreAsserts
; if ignore_asserts || not (name `hasKey` assertIdKey)
then return (HsVar name, unitFV name)
else do { e <- mkAssertErrorExpr
; return (e, unitFV name) } }
То, где он заменяет assert
на assertError
, но только если утверждения включены.
assertError
определяется в GHC.IO.Exception