1 -----------------------------------------------------------------------------
3 -- Module : Debug.Trace
4 -- Copyright : (c) The University of Glasgow 2001
5 -- License : BSD-style (see the file libraries/base/LICENSE)
7 -- Maintainer : libraries@haskell.org
8 -- Stability : provisional
9 -- Portability : portable
11 -- The 'trace' function.
13 -----------------------------------------------------------------------------
17 putTraceMsg, -- :: String -> IO ()
18 trace -- :: String -> a -> a
22 import System.IO.Unsafe
24 #ifdef __GLASGOW_HASKELL__
25 import Foreign.C.String
27 import System.IO (hPutStrLn,stderr)
30 -- | 'putTraceMsg' function outputs the trace message from IO monad.
31 -- Usually the output stream is 'System.IO.stderr' but if the function is called
32 -- from Windows GUI application then the output will be directed to the Windows
34 putTraceMsg :: String -> IO ()
36 #ifndef __GLASGOW_HASKELL__
39 withCString "%s\n" $ \cfmt ->
40 withCString msg $ \cmsg ->
43 foreign import ccall unsafe debugBelch :: CString -> CString -> IO ()
46 {-# NOINLINE trace #-}
48 When called, 'trace' outputs the string in its first argument, before
49 returning the second argument as its result. The 'trace' function is not
50 referentially transparent, and should only be used for debugging, or for
51 monitoring execution. Some implementations of 'trace' may decorate the string
52 that\'s output to indicate that you\'re tracing. The function is implemented on
55 trace :: String -> a -> a
56 trace string expr = unsafePerformIO $ do