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