Hello Functional World: Counting occurrences of each letter
As @Caridorc says, this is functional code, not imperative.  It's basically pretty good.

It would be a good idea to include type annotations — for example, (xs:string).  If you wanted to (and I'm not saying it would be better to do so), you could drop xs as an explicit parameter and change the pipeline into a composition of functions.  Also, you could sort before grouping for a slight simplification.

I find the fold in tuplesToString a bit hard to follow.  In my opinion, using String.concat would be clearer, and it would also eliminate the extra space at the end of the line.

I'd rename both functions to have "counts" in their name.  You can see the coherence in getLetterCounts |&gt; countsToString.

open System

let getLetterCounts:(string -&gt; seq&lt;char * int&gt;) =
    Seq.filter Char.IsLetter &gt;&gt;
    Seq.map Char.ToUpper &gt;&gt;
    Seq.sort &gt;&gt;
    Seq.groupBy id &gt;&gt;
    Seq.map (fun (k, v) -&gt; (k, Seq.length v))

let countsToString (counts:seq&lt;char * int&gt;) =
    [for k, v in counts -&gt; sprintf "[%c, %i];" k v] |&gt; String.concat " "

"Hello World" |&gt; getLetterCounts |&gt; countsToString |&gt; printfn "%s"