Copyright | (c) 2016 Stephen Diehl (c) 2016-2018 Serokell (c) 2018-2023 Kowainik |
---|---|
License | MIT |
Maintainer | Kowainik <xrom.xkov@gmail.com> |
Stability | Stable |
Portability | Portable |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
This module contains functions for debugging pure functions. You
can't use functions like putStrLn
for this purpose because
they require changes to the type signature, but functions in this module
avoid this problem by being pure on their own.
Additionally, these functions produce compile-time warnings, if you leave them in your code. Warnings help you to cleanup all debugging usages before releasing.
ghci> foo = trace "I forgot trace in code"
<interactive>:4:7: warning: [-Wdeprecations]
In the use of ‘trace’ (imported from Relude):
"trace
remains in code"
The following table briefly shows names and types of all functions in this module.
Name | Type |
---|---|
trace | String -> a -> a |
traceShow | Show a => a -> b -> b |
traceShowId | Show a => a -> a |
traceShowWith | Show b => (a -> b) -> a -> a |
traceId | String -> String |
traceM | (Applicative f) => String -> f () |
traceShowM | (Show a, Applicative f) => a -> f () |
⚠ NOTE: Use these functions only for local debugging purposes. They break referential transparency, they are only useful when you want to observe intermediate values of your pure functions and to understand the behaviour locally. If you want to log debug messages in your application, consider using a logging library instead.
Synopsis
- trace :: String -> a -> a
- traceShow :: Show a => a -> b -> b
- traceShowId :: Show a => a -> a
- traceShowWith :: Show b => (a -> b) -> a -> a
- traceId :: String -> String
- traceM :: Applicative f => String -> f ()
- traceShowM :: (Show a, Applicative f) => a -> f ()
- error :: forall (r :: RuntimeRep) (a :: TYPE r) (t :: Type). (HasCallStack, IsText t) => t -> a
- data Undefined = Undefined
- undefined :: forall (r :: RuntimeRep). forall (a :: TYPE r). HasCallStack => a
Tracing
trace :: String -> a -> a Source #
Warning: trace
remains in code
Prints the given String
message and returns the passed value of
type a
.
>>>
increment l = map (+1) l
>>>
increment [2, 3, 4]
[3,4,5]
>>>
increment l = trace ("incrementing each value of: " ++ show l) (map (+1) l)
>>>
increment [2, 3, 4]
incrementing each value of: [2,3,4] [3,4,5]
- If you want to print a
Show
able value instead ofString
, usetraceShow
. - If you want to print the value itself, use
traceShowId
. - If you want to print by specifying a custom formatting function, use
traceShowWith
.
traceShow :: Show a => a -> b -> b Source #
Warning: traceShow
remains in code
Similar to trace
but prints a given value with the Show
instance instead of a String
.
>>>
increment l = map (+1) l
>>>
increment [2, 3, 4]
[3,4,5]
>>>
increment l = traceShow l (map (+1) l)
>>>
increment [2, 3, 4]
[2,3,4] [3,4,5]
- If you want to print a specific
String
instead, usetrace
- If you want to print and return the same value, use
traceShowId
- If you want to specify a custom printing function, use
traceShowWith
traceShowId :: Show a => a -> a Source #
Warning: traceShowId
remains in code
Similar to traceShow
but prints the given value itself instead
of a separate value.
>>>
traceShowId (1+2+3, "hello" ++ "world")
(6,"helloworld") (6,"helloworld")
- If you to specify a different value to print, use
trace
ortraceShow
- If you want to have more control over printing, use
traceShowWith
traceShowWith :: Show b => (a -> b) -> a -> a Source #
Warning: 'traceShowWith remains in code
Similar traceShowId
, but uses a provided function to convert the
argument to a value with the Show
constraint.
>>>
traceShowWith fst (1, "ABC")
1 (1,"ABC")
In other words,
.traceShowId
≡ traceShowWith
id
This function is useful for debugging values that do not have Show
instance:
>>>
fst $ traceShowWith fst (1, id)
1 1
- If you don't need such flexibility, use simpler
trace
,traceShow
ortraceShowId
Since: 1.0.0.0
traceId :: String -> String Source #
Warning: traceId
remains in code
Similar to traceShowId
but specialised for String
.
>>>
traceId "hello"
"hello hello"
traceM :: Applicative f => String -> f () Source #
Warning: traceM
remains in code
Trace function to print values while working a pure monad
(e.g. Maybe
, State
, etc.)
>>>
:{
let action :: Maybe Int action = do x <- Just 3 traceM ("x: " ++ show x) y <- pure 12 traceM ("y: " ++ show y) pure (x*2 + y) in action :} x: 3 y: 12 Just 18
- If you want to print a value with the
Show
instance instead, usetraceShowM
traceShowM :: (Show a, Applicative f) => a -> f () Source #
Warning: traceShowM
remains in code
Like traceM
, but uses show
on the argument to convert it to a
String
.
>>>
:{
let action :: Maybe Int action = do x <- Just 3 traceShowM x y <- pure 12 traceShowM y pure (x*2 + y) in action :} 3 12 Just 18
Imprecise error
error :: forall (r :: RuntimeRep) (a :: TYPE r) (t :: Type). (HasCallStack, IsText t) => t -> a Source #
Throw pure errors. Use this function only to when you are sure that this
branch of code execution is not possible. DO NOT USE error
as a normal
error handling mechanism.
>>>
error "oops"
*** Exception: oops CallStack (from HasCallStack): error, called at src/Relude/Debug.hs:289:11 in ... ...
⚠️CAUTION⚠️ Unlike Prelude version, error
takes Text
as an
argument. In case it used by mistake, the user will see the following:
>>>
error ("oops" :: String)
... ... 'error' expects 'Text' but was given 'String'. Possible fixes: * Make sure OverloadedStrings extension is enabled * Use 'error (toText msg)' instead of 'error msg' ...>>>
error False
... ... 'error' works with 'Text' But given: Bool ...
Instances
undefined :: forall (r :: RuntimeRep). forall (a :: TYPE r). HasCallStack => a Source #