p package:th-printf

Like s, but prints the resulting string to stdout.
[p|Hello, %s! (%d people greeted)|] :: MonadIO m => ... -> m ()
Text.Printf is a useful module, but due to the typeclass hacks it uses, it can be hard to tell if the format string you wrote is well-formed or not. This package provides a mechanism to create formatting functions at compile time. Note that, to maintain consistency with other printf implementations, negative ints that are printed as unsigned will "underflow". (Text.Printf does this too.)
>>> [s|%u|] (-1 :: Int32)
WAS "4294967295"
NOW Not in scope: type constructor or class `Int32'
Thus, any time you want to print a number using the unsigned, octal, or hex specifiers, your input must be an instance of Bounded.
Quasiquoters for printf Quasiquoters for string and text printf
Like p, but takes as its first argument the Handle to print to.
[hp|Hello, %s! (%d people greeted)|] :: MonadIO m => Handle -> ... -> m ()
Takes a format string as input and produces a tuple (args, outputExpr). This function processes character escapes as they would appear in Haskell source code. It will emit warnings (or throw an error, as appropriate) when given an invalid format string. Use if you wish to leverage th-printf in conjunction with, for example, an existing logging library.