F#の計算式でFizzBuzz

かるくぐぐったところ、計算式を使ったFizzBuzzは見当たらなかったのでやってみました。

type FizzBuzzBuilder() =
member x.For(elements, forBody) =
for e in elements do forBody e
member x.Yield(i) =
if i % 3 = 0 && i % 5 = 0 then printfn "Fizz Buzz"
elif i % 3 = 0 then printfn "Fizz"
elif i % 5 = 0 then printfn "Buzz"
else printfn "%d" i

let fizzbuzz = FizzBuzzBuilder()

fizzbuzz {
for i in 1..100 -> i
}

F#の計算式という機能を使うと、ループやバインディングなどの挙動をカスタマイズできるようです。ここでは、fizzbuzz { ... } の中でforループとyieldの挙動を変えて、yieldしたときに(上のコードだと下から2行目の -> がyield相当)Fizz Buzzを出力するようにしています。
詳しくはドキュメントを。http://msdn.microsoft.com/ja-jp/library/dd233182.aspx


計算式うまく使えば可能性広がりそうです。かっこいい計算式つくってみたい。