12 Days of Christmas with F#
You should generally avoid List.append because appending to a singly-linked list is quite inefficient.

I think your getVerse function is probably doing too much. You can have a function to get a line at a time which is just int -&gt; string

Recursion can be avoided here if you switch to a list comprehension (the for...in syntax). Recursion is rarely needed in F#.

Even folding can be avoided here as it's simpler to use String.concat.

With all of these changes and a couple more:

let ordinalSuffix = function 1 -&gt; "st" | 2 -&gt; "nd" | 3 -&gt; "rd" | _ -&gt; "th"

let preamble num =
    sprintf "On the %i%s day of Christmas, my true love gave to me" num (ordinalSuffix num)

let line num = 
    match num with
    | 12 -&gt; "12 drummers drumming"
    | 11 -&gt; "11 pipers piping"
    | 10 -&gt; "10 lords a-leaping"
    | 9 -&gt; "9 ladies dancing"
    | 8 -&gt; "8 maids a-milking"
    | 7 -&gt; "7 swans a-swimming"
    | 6 -&gt; "6 geese a-laying"
    | 5 -&gt; "5 golden rings"
    | 4 -&gt; "4 calling birds"
    | 3 -&gt; "3 French hens"
    | 2 -&gt; "2 turtle doves, and"
    | _ -&gt; "A partridge in a pear tree"

let verse num =
    preamble num :: [ for i in num .. -1 .. 1 -&gt; line i ]
    |&gt; String.concat "\n"

[1 .. 12] |&gt; List.map verse |&gt; String.concat "\n\n" |&gt; printfn "%s"