Seq.choose と Seq.exists で FizzBuzz

無理やりな感が満載ですが。

Seq.chooseで1から100までの数値をシーケンスのグループに分け、そのあとでSeq.existsでそれぞれのグループへの存在チェックをしています。

[<Test>]
let ``fizzbuzz with Seq.choose``() =

let (|Fizz|_|) n = if n % 3 = 0 then Some() else None
let (|Buzz|_|) n = if n % 5 = 0 then Some() else None

let nums = seq { 1 .. 100 }
let fizzbuzz = nums |> Seq.choose (fun n -> match n with Fizz & Buzz -> Some(n) | _ -> None)
let fizz = nums |> Seq.choose (fun n -> match n with Fizz -> Some(n) | _ -> None)
let buzz = nums |> Seq.choose (fun n -> match n with Buzz -> Some(n) | _ -> None)

nums
|> Seq.map (fun n ->
if
fizzbuzz |> Seq.exists ((=) n) then "fizzbuzz"
elif fizz |> Seq.exists ((=) n) then "fizz"
elif buzz |> Seq.exists ((=) n) then "buzz"
else string(n))
|> Seq.iter (printfn "%s")