Now, I don't won't get into arguments about how String.Concat() is more performant
here. String.Format() allows code to be more easily localized and it is being used
for that purpose here. The real problem is that StringBuilder.AppendFormat() should
be used instead:

The above code creates a new string and then concatenates to it inside of a for-loop.
This causes two new strings to be created on each pass--one from String.Format()
and one from the concatenation. This is woefully inefficient.

Next, I tested the same code modified to use a StringBuilder with String.Format():

As you can see, it is important to know when to use String.Format and when to
use StringBuilder.AppendFormat(). While the performance boosts that can be achieved
are fairly small, they are too easy to code.

Because this book provides source code in Standard ML, it's a fantastic
resource for learning F#. One bit of warning: this book does not teach classic
data structures. While structures such as binomial heaps and red-black trees
are presented, it is assumed that the reader already knows and understands
them.

That's right. This isn't a programming book. It's a diversion. Reading programming books all of the
time is hazardous to your happiness and well-being. Take the time to enjoy something else. You'll thank me later.

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent
my employer's view in any way.