The user can generate the string however they want. The proposed traceM does not duplicate any printf functionality, and neither requires nor prevents the use of printf.
It is more about allowing the user to add trace actions in an arbitrary monad, rather than just the IO monad. If people want to trace in IO, and we think it is worth a function to do that, might they not want to trace in any monad, and it be worth adding a function for that?
Chris