Format a variable number of arguments with the C-style formatting string.
 The return value is either String or (IO a).
 The format string consists of ordinary characters and /conversion
 specifications/, which specify how to format one of the arguments
 to printf in the output string.  A conversion specification begins with the
 character %, followed by one or more of the following flags:
     -      left adjust (default is right adjust)
    +      always use a sign (+ or -) for signed conversions
    0      pad with zeroes rather than spaces
followed optionally by a field width:
     num    field width
    *      as num, but taken from argument list
followed optionally by a precision:
     .num   precision (number of decimal places)
 and finally, a format character:
     c      character               Char, Int, Integer, ...
    d      decimal                 Char, Int, Integer, ...
    o      octal                   Char, Int, Integer, ...
    x      hexadecimal             Char, Int, Integer, ...
    X      hexadecimal             Char, Int, Integer, ...
    u      unsigned decimal        Char, Int, Integer, ...
    f      floating point          Float, Double
    g      general format float    Float, Double
    G      general format float    Float, Double
    e      exponent format float   Float, Double
    E      exponent format float   Float, Double
    s      string                  String
Mismatch between the argument types and the format string will cause
 an exception to be thrown at runtime.
 Examples:
    > printf "%d\n" (23::Int)
   23
   > printf "%s %s\n" "Hello" "World"
   Hello World
   > printf "%.2f\n" pi
   3.14
  |