[GHC] #9795: Debug.Trace.trace is too strict

GHC ghc-devs at haskell.org
Tue Feb 17 14:47:47 UTC 2015


#9795: Debug.Trace.trace is too strict
-------------------------------------+-------------------------------------
        Reporter:  jcpetruzza        |                   Owner:
            Type:  bug               |                  Status:  merge
        Priority:  normal            |               Milestone:  7.12.1
       Component:  libraries/base    |                 Version:  7.8.3
      Resolution:                    |                Keywords:
Operating System:  Unknown/Multiple  |            Architecture:
 Type of failure:  None/Unknown      |  Unknown/Multiple
      Blocked By:                    |               Test Case:
 Related Tickets:                    |                Blocking:
                                     |  Differential Revisions:
-------------------------------------+-------------------------------------

Comment (by jcpetruzza):

 I still think that being strict on the string is the wrong default for a
 function whose only purpose is debugging pure functions, and I don't quite
 see what the benefit of the current behaviour is.

 Simon's workaround works after the fact, when you already know that the
 problem might be `res` being bottom. When starting a debugging session,
 one doesn't always have a clear suspicion of the culprit. A good part of
 the usefulness of `trace` is giving you an indication that certain
 expression is actually being evaluated, even if the full string fails to
 be printed in full.

 The way I see it, in order to avoid problems with a strict `trace`, one
 should be more defensive and start using it as Simon indicates in a
 systematical way. Consider for example the following excerpt from the
 [[https://wiki.haskell.org/Debugging|wiki entry on debugging]]:

     A common idiom to trace a function is:
     {{{
     #!haskell
     myfun a b | trace ("myfun " ++ show a ++ " " ++ show b) False =
 undefined
     myfun a b = ...
     }}}

 With the current behaviour, I believe this should really be:

    {{{
     #!haskell
     myfun a b | trace "myfun " $ trace (show a ++ " " ++ show b) False =
 undefined
     myfun a b = ...
     }}}

 and/or an explanation on `trace` being strict and what could happen if
 `show a` or `show b` loop or have an infinite output. With a lazy `trace`
 all this goes away, making `trace` more powerful and easier to use.
 Perhaps there are very good reasons to keep `trace` strict, but I'm not
 aware of them...

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9795#comment:14>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list