I've implemented 12 Days of Christmas just by using pattern matching. It's not very efficient as it performs 12 iterations, each performing its own iteration (potentially from 12 down to 1... does tail recursion kick in here though?) but I supposed I can live with that at the moment. I'm more concerned with learning how idiomatic F# is written. Would an F# programmer be more concerned with creating types, etc.?
module Christmas
let getOrdinal num =
match num with
| 1 -> sprintf "%ist" num
| 2 -> sprintf "%ind" num
| 3 -> sprintf "%ird" num
| _ -> sprintf "%ith" num
let getPreamble num =
sprintf "On the %s day of Christmas, my true love gave to me" (getOrdinal num)
let rec getVerse verse num =
match num with
| 12 -> getVerse (List.append verse ["12 drummers drumming"]) (num - 1)
| 11 -> getVerse (List.append verse ["11 pipers piping"]) (num - 1)
| 10 -> getVerse (List.append verse ["10 lords a-leaping"]) (num - 1)
| 9 -> getVerse (List.append verse ["9 ladies dancing"]) (num - 1)
| 8 -> getVerse (List.append verse ["8 maids a-milking"]) (num - 1)
| 7 -> getVerse (List.append verse ["7 swans a-swimming"]) (num - 1)
| 6 -> getVerse (List.append verse ["6 geese a-laying"]) (num - 1)
| 5 -> getVerse (List.append verse ["5 golden rings"]) (num - 1)
| 4 -> getVerse (List.append verse ["4 calling birds"]) (num - 1)
| 3 -> getVerse (List.append verse ["3 French hens"]) (num - 1)
| 2 -> getVerse (List.append verse ["2 turtle doves, and"]) (num - 1)
| _ -> List.append verse ["A partridge in a pear tree"]
let composeVerse num =
List.append [getPreamble num] (getVerse [] num)
|> List.fold (fun r s -> r + s + "\n") ""
[1 .. 12]
|> Seq.iter (fun a -> printfn "%s" (composeVerse a))