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