判別共用体でFizzBuzz

FizzBuzzの条件を判定する処理をばらばらのラムダ式にしてみました。
一度数値を判別共用体でラップしシーケンスにとります。後続のシーケンスでは、FizzBuzzの条件に合致したら値を置き換え、条件に合致しない場合や、すでにFizzBuzzしている場合はそのまま次のシーケンスに流します。

type FizzBuzz =
| FizzBuzz of string
| Num of int

[<Test>]
let ``fizzbuzz with union``() =
seq {1 .. 100}
|> Seq.map (fun n -> Num(n))
|> Seq.map (function Num(n) when n % 15 = 0 -> FizzBuzz("fizzbuzz") | x -> x)
|> Seq.map (function Num(n) when n % 3 = 0 -> FizzBuzz("fizz") | x -> x)
|> Seq.map (function Num(n) when n % 5 = 0 -> FizzBuzz("buzz") | x -> x)
|> Seq.map (function Num(n) -> string(n) | FizzBuzz(s) -> s)
|> Seq.iter (printfn "%s")

この方法はFizzBuzz以外でも、データをシーケンスの中でだんだんと変形していく場合に使えるかもしれません。