Safe Haskell | None |
---|---|
Language | Haskell98 |
- newtype LineNo = LineNo {}
- newtype ColumnNo = ColumnNo {
- unColumnNo :: Int
- data Span = Span {
- spanFile :: !FilePath
- spanStartLine :: !LineNo
- spanStartColumn :: !ColumnNo
- spanEndLine :: !LineNo
- spanEndColumn :: !ColumnNo
- getCaller :: CallStack -> Maybe Span
- data CallStack :: *
- type HasCallStack = ?callStack :: CallStack
- callStack :: HasCallStack -> CallStack
- withFrozenCallStack :: HasCallStack => (HasCallStack -> a) -> a
Documentation
Span | |
|
Re-exports from GHC.Stack
CallStack
s are a lightweight method of obtaining a
partial call-stack at any point in the program.
A function can request its call-site with the HasCallStack
constraint.
For example, we can define
errorWithCallStack :: HasCallStack => String -> a
as a variant of error
that will get its call-site. We can access the
call-stack inside errorWithCallStack
with callStack
.
errorWithCallStack :: HasCallStack => String -> a errorWithCallStack msg = error (msg ++ "n" ++ prettyCallStack callStack)
Thus, if we call errorWithCallStack
we will get a formatted call-stack
alongside our error message.
>>>
errorWithCallStack "die"
*** Exception: die CallStack (from HasCallStack): errorWithCallStack, called at <interactive>:2:1 in interactive:Ghci1
GHC solves HasCallStack
constraints in three steps:
- If there is a
CallStack
in scope -- i.e. the enclosing function has aHasCallStack
constraint -- GHC will append the new call-site to the existingCallStack
. - If there is no
CallStack
in scope -- e.g. in the GHCi session above -- and the enclosing definition does not have an explicit type signature, GHC will infer aHasCallStack
constraint for the enclosing definition (subject to the monomorphism restriction). - If there is no
CallStack
in scope and the enclosing definition has an explicit type signature, GHC will solve theHasCallStack
constraint for the singletonCallStack
containing just the current call-site.
CallStack
s do not interact with the RTS and do not require compilation
with -prof
. On the other hand, as they are built up explicitly via the
HasCallStack
constraints, they will generally not contain as much
information as the simulated call-stacks maintained by the RTS.
A CallStack
is a [(String, SrcLoc)]
. The String
is the name of
function that was called, the SrcLoc
is the call-site. The list is
ordered with the most recently called function at the head.
NOTE: The intrepid user may notice that HasCallStack
is just an
alias for an implicit parameter ?callStack :: CallStack
. This is an
implementation detail and should not be considered part of the
CallStack
API, we may decide to change the implementation in the
future.
Since: 4.8.1.0
type HasCallStack = ?callStack :: CallStack #
Request a CallStack.
NOTE: The implicit parameter ?callStack :: CallStack
is an
implementation detail and should not be considered part of the
CallStack
API, we may decide to change the implementation in the
future.
Since: 4.9.0.0
callStack :: HasCallStack -> CallStack #
withFrozenCallStack :: HasCallStack => (HasCallStack -> a) -> a #
Perform some computation without adding new entries to the CallStack
.
Since: 4.9.0.0