I'm continuing my series showing ways in which
F# is a exciting .NET
language. As I mentioned before, if you have any suggestions for future topics
please feel free to email them to
dustin AT diditwith.net.
While F# can easily access the standard .NET formatting functions (e.g.
String.Format()), it also provides its own set of functions for outputting
formatted text. In fact, F# offers the a
printf-based family of
functions that should be familiar to C programmers. Consider the following
simple example using F#'s
interactive environment.
> printf "%s %d 0x%x %.2f\n" "F# Rules!" 128 128 12.8;;
F# Rules! 128 0x80 12.80
Most of these formatting functions also have an additional "n" version that implicitly
adds a new-line character. For example, we could modify the above code to use printfn like so:
> printfn "%s %d 0x%x %.2f" "F# Rules!" 128 128 12.8;;
F# Rules! 128 0x80 12.80
Of course, using an invalid argument will result in an error. Notice what
happens if we pass 12 instead of 12.8 for the %f format specifier:
> printfn "%s %d 0x%x %.2f" "F# Rules!" 128 128 12;;
printfn "%s %d 0x%x %.2f" "F# Rules!" 128 128 12;;
----------------------------------------------^^^
stdin(3,46): error: FS0001: The type 'int' is not compatible with any of the
types float,float32, arising from the use of a printf-style format string
stopped due to error
What should give .NET developers pause is the fact that the error above does
not occur at runtime. This isn't some exception being thrown—it's a compiler error. In other words, the compiler
actually parses and type-checks format strings!
This behavior becomes more useful inside of Visual Studio. When a type mismatch occurs within a format
string, the F# background compiler marks the problem with a red squiggly underline:

Hovering the mouse over the error will show a tooltip containing the same
message that the interactive environment displayed.

This is another example of how F# is extremely statically-typed. The F# compiler works to make even format
strings type-safe.