It’s easy to lose track of important data when logging output to the console window, fortunately you can use the System.Console.ConsoleColor property to set the output color. But unlike F#’s printfn, System.Console.WriteLine doesn’t use type inference and feels much different than the printf and printfn methods you’re used to.

Here’s how to create a version of printfn that takes a console color parameter.


/// Colored printf
let cprintf c fmt = 

        (fun s -> 
            let old = System.Console.ForegroundColor 
              System.Console.ForegroundColor <- c;
              System.Console.Write s
              System.Console.ForegroundColor <- old) 
// Colored printfn
let cprintfn c fmt = 
    cprintf c fmt
    printfn ""

open System
cprintfn ConsoleColor.Blue  "Hello, World in BLUE!"
cprintfn ConsoleColor.Red   "... and in RED!"
cprintfn ConsoleColor.Green "... and in GREEN!"

let rotatingColors = 
    seq { 
        let i = ref 0
        let possibleColors = Enum.GetValues(typeof<ConsoleColor>)
        while true do
            yield (enum (!i) : ConsoleColor)
            i := (!i + 1) % possibleColors.Length

"Experience the rainbow of possibility!"
|> rotatingColors
|> Seq.iter (fun (color, letter) -> cprintf color "%c" letter)

printfn ""
Console.WriteLine("(press any key to continue")
Console.ReadKey(true) |> ignore