[GHC] #7626: Add common utility variants of trace to Debug.Trace
GHC
cvs-ghc at haskell.org
Fri Jan 25 17:22:45 CET 2013
#7626: Add common utility variants of trace to Debug.Trace
-----------------------------+----------------------------------------------
Reporter: chrisseaton | Owner:
Type: feature request | Status: new
Priority: normal | Component: libraries/base
Version: 7.6.1 | Keywords: trace
Os: Unknown/Multiple | Architecture: Unknown/Multiple
Failure: None/Unknown | Blockedby:
Blocking: | Related:
-----------------------------+----------------------------------------------
As discussed on the libraries list.
http://www.haskell.org/pipermail/libraries/2013-January/019319.html
'traceId' traces a value, and then returns that same value. This avoids
the common case of 'trace a a'.
{{{
traceId :: String -> String
traceId a = trace a a
}}}
'traceM' runs 'trace' and returns unit in an arbitrary monad. This is
useful for writing traces in do-notation, as each can sit on their own
line.
{{{
traceM :: (Monad m) => String -> m ()
traceM string = trace string $ return ()
}}}
For example:
{{{
... = do
x <- ...
traceM $ "x: " ++ show x
y <- ...
...
}}}
That application of 'traceM' there can be temporarily commented out with a
simple line comment.
Finally, equivalents of 'traceShow' for those two functions.
{{{
traceShowId :: (Show a) => a -> a
traceShowId a = trace (show a) a
}}}
{{{
traceShowM :: (Show a, Monad m) => a -> m ()
traceShowM = traceM . show
}}}
Advantages:
I use these functions in my code all the time. When I discussed it on the
libraries list there were several enthusiastic +1s of people doing the
same.
Disadvantages:
The documentation in the patch makes it clear that traceM does not
actually add a trace action to the monad you're using, which is a
potential point of confusion
(http://www.haskell.org/pipermail/libraries/2013-January/019322.html). I
had originally suggested that 'traceIO == traceM', but it turns out this
is not so.
Henning Thielemann suggested that 'traceM' was better achieved with
directly using 'trace' and 'printf'
(http://www.haskell.org/pipermail/libraries/2013-January/019320.html). Of
course, any function can be replaced with its RHS, and whether or not the
user uses 'show' or 'printf' or whatever is orthogonal.
I haven't written any tests, as it's all output generating code, so I'm
really not sure how that's tested in GHC - sorry.
Status of patch:
Applies against base 3b51b741f45d4d85e79b2128d00479ce230f72f2 and compiles
with GHC 388e1e825f79f2d16536fc583a48e5ce9c191b06. I've run a full GHC
compile cycle with it without problem. Includes documentation.
--
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7626>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list