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