traceCall :: (Show a, Show b) => String -> (a -> b) -> a -> b
traceCall msg fn arg =
    let
        retval = fn arg
    in 
        trace (msg         ++
               " "         ++
               show arg    ++
               " returns " ++
               show retval ++
               "\n") retval
traceCall :: (Show a, Show b) => String -> (a -> b) -> a -> b
traceCall msg fn arg =
    let
        retval = fn arg
    in 
        trace (msg         ++
               " "         ++
               show arg    ++
               " returns " ++
               show retval ++
               "\n") retval
traceCall msg fn arg =
    let
        retval = fn arg
    in 
        trace (msg         ++
               " "         ++
               show arg    ++
               " returns " ++
               show retval ++
               "\n") retval