Hi

I've compiled the Debug.Trace module to Core, but can't understand the
resulting output. The original code is:

trace string expr = unsafePerformIO $ do
    putTraceMsg string
    return expr

The core is:

Debug.Trace.trace =
   \ (@ a) ->
     __letrec {
       trace :: GHC.Base.String -> a -> a
       []
       trace =
         \ (string :: GHC.Base.String) (expr :: a) ->
           GHC.Base.$
             @ (GHC.IOBase.IO a)
             @ a
             (GHC.IOBase.unsafePerformIO @ a)
             (>> @ () @ a (Debug.Trace.putTraceMsg string) (return @ a expr));
       $dMonad :: GHC.Base.Monad GHC.IOBase.IO
       []
       $dMonad = $dMonad;
       return :: forall a. a -> GHC.IOBase.IO a
       []
       return = GHC.Base.return @ GHC.IOBase.IO $dMonad;
       $dMonad :: GHC.Base.Monad GHC.IOBase.IO
       []
       $dMonad = GHC.IOBase.$f16;
       >> :: forall a b.
             GHC.IOBase.IO a -> GHC.IOBase.IO b -> GHC.IOBase.IO b
       []
       >> = GHC.Base.>> @ GHC.IOBase.IO $dMonad;
     } in  trace;

And my Haskell reformatting of that is:

Debug.Trace.trace = let
       trace string expr = unsafePerformIO $ putTraceMsg string >> return expr
       $dMonad = $dMonad;
       return = GHC.Base.return $dMonad;
       $dMonad = GHC.IOBase.$f16;
       >> = GHC.Base.>> $dMonad;
    in  trace

However, that let expression has two bindings for $dMonad, one of
which looks like a black-hole. Are the semantics of __letrec different
from let in some way?

Thanks

Neil
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to