関数合成 で FizzBuzz

F# User Group - Japanにあるコードを参考にさせてもらいました。

type FizzBuzz =
| Str of string
| Num of int

[<Test>]
let ``fizzbuzz with function composition``() =

let f x word y = match y with
| Num(n) -> if n % x = 0 then Str(word) else Num(n)
| s -> s

let fizzbuzz = f 15 "fizzbuzz"
let fizz = f 3 "fizz"
let buzz = f 5 "buzz"

seq { for i in 1 .. 100 -> Num(i)}
|> Seq.map (fizzbuzz >> fizz >> buzz >> (function Str(s) -> s | Num(n) -> string(n)) )
|> Seq.iter (printfn "%s")