let fizzbuzz i =
printfn "call fizzbuzz %A" i
if i % 15 = 0 then Some("FizzBuzz") else None
let fizz i =
printfn "call fizz %A" i
if i % 3 = 0 then Some("Fizz") else None
let buzz i =
printfn "call buzz %A" i
if i % 5 = 0 then Some("Buzz") else None
type OptBuilder() =
member self.Bind (s, f) =
match s with
| None -> f()
| _ -> s
member self.Return x = Some(x)
let opt = new OptBuilder()
let f i =
opt {
do! fizzbuzz i
do! fizz i
do! buzz i
return (string i)
}
let (<||>) a b =
match a with
| None -> b
| _ -> a
let g i = fizzbuzz i <||> fizz i <||> buzz i <||> Some(string i)
let (|FizzBuzz|_|) i = fizzbuzz i
let (|Fizz|_|) i = fizz i
let (|Buzz|_|) i = buzz i
let (|Else|) i = string i
let h i =
match i with
| FizzBuzz(s) -> s
| Fizz(s) -> s
| Buzz(s) -> s
| Else(s) -> s
let p i =
match i with
| _ when i % 15 = 0 -> "FizzBuzz"
| _ when i % 3 = 0 -> "Fizz"
| _ when i % 5 = 0 -> "Buzz"
| _ -> string i
let q i =
if i % 15 = 0 then
"FizzBuzz"
elif i % 3 = 0 then
"Fizz"
elif i % 5 = 0 then
"Buzz"
else
string i
let r i =
match (i % 3, i % 5) with
| (0, 0) -> "FizzBuzz"
| (0, _) -> "Fizz"
| (_, 0) -> "Buzz"
| _ -> string i
let fizzbuzz_u i k =
printfn "call fizzbuzz_u %A" i
if i % 15 = 0 then "FizzBuzz" else k i
let fizz_u i k =
printfn "call fizz_u %A" i
if i % 3 = 0 then "Fizz" else k i
let buzz_u i k =
printfn "call buzz_u %A" i
if i % 5 = 0 then "Buzz" else k i
let u i =
fizzbuzz_u i (fun i ->
fizz_u i (fun i ->
buzz_u i (fun i ->
string i
)))
[<EntryPoint>]
let main _ =
let pr s t = let x = t 12 in printfn "%s ... %A" s x
pr "f" f
pr "g" g
pr "h" h
pr "p" p
pr "q" q
pr "r" r
pr "u" u
0
ICAgIApsZXQgZml6emJ1enogaSA9CiAgICBwcmludGZuICJjYWxsIGZpenpidXp6ICVBIiBpCiAgICBpZiBpICUgMTUgPSAwIHRoZW4gU29tZSgiRml6ekJ1enoiKSBlbHNlIE5vbmUKCmxldCBmaXp6IGkgPQogICAgcHJpbnRmbiAiY2FsbCBmaXp6ICVBIiBpCiAgICBpZiBpICUgMyA9IDAgdGhlbiBTb21lKCJGaXp6IikgZWxzZSBOb25lCgpsZXQgYnV6eiBpID0KICAgIHByaW50Zm4gImNhbGwgYnV6eiAlQSIgaQogICAgaWYgaSAlIDUgPSAwIHRoZW4gU29tZSgiQnV6eiIpIGVsc2UgTm9uZQoKCnR5cGUgT3B0QnVpbGRlcigpID0KICAgIG1lbWJlciBzZWxmLkJpbmQgKHMsIGYpID0KICAgICAgICBtYXRjaCBzIHdpdGgKICAgICAgICB8IE5vbmUgLT4gZigpCiAgICAgICAgfCBfICAgIC0+IHMKICAgIG1lbWJlciBzZWxmLlJldHVybiB4ID0gU29tZSh4KQoKbGV0IG9wdCA9IG5ldyBPcHRCdWlsZGVyKCkgICAgCgpsZXQgZiBpID0KICAgIG9wdCB7CiAgICAgICAgZG8hIGZpenpidXp6IGkKICAgICAgICBkbyEgZml6eiBpCiAgICAgICAgZG8hIGJ1enogaQogICAgICAgIHJldHVybiAoc3RyaW5nIGkpCiAgICB9CgoKbGV0ICg8fHw+KSBhIGIgPQogICAgbWF0Y2ggYSB3aXRoCiAgICB8IE5vbmUgLT4gYgogICAgfCBfICAgIC0+IGEKICAgIApsZXQgZyBpID0gZml6emJ1enogaSA8fHw+IGZpenogaSA8fHw+IGJ1enogaSA8fHw+IFNvbWUoc3RyaW5nIGkpCgoKbGV0ICh8Rml6ekJ1enp8X3wpIGkgPSBmaXp6YnV6eiBpCmxldCAofEZpenp8X3wpIGkgPSBmaXp6IGkKbGV0ICh8QnV6enxffCkgaSA9IGJ1enogaQpsZXQgKHxFbHNlfCkgaSA9IHN0cmluZyBpCgpsZXQgaCBpID0KICAgIG1hdGNoIGkgd2l0aAogICAgfCBGaXp6QnV6eihzKSAtPiBzCiAgICB8IEZpenoocykgICAgIC0+IHMKICAgIHwgQnV6eihzKSAgICAgLT4gcwogICAgfCBFbHNlKHMpICAgICAtPiBzCgogICAgCmxldCBwIGkgPQogICAgbWF0Y2ggaSB3aXRoCiAgICB8IF8gd2hlbiBpICUgMTUgPSAwIC0+ICJGaXp6QnV6eiIKICAgIHwgXyB3aGVuIGkgJSAgMyA9IDAgLT4gIkZpenoiCiAgICB8IF8gd2hlbiBpICUgIDUgPSAwIC0+ICJCdXp6IgogICAgfCBfIC0+IHN0cmluZyBpCgoKbGV0IHEgaSA9CiAgICBpZiBpICUgMTUgPSAwIHRoZW4KICAgICAgICAiRml6ekJ1enoiCiAgICBlbGlmIGkgJSAzID0gMCB0aGVuCiAgICAgICAgIkZpenoiCiAgICBlbGlmIGkgJSA1ID0gMCB0aGVuCiAgICAgICAgIkJ1enoiCiAgICBlbHNlCiAgICAgICAgc3RyaW5nIGkKCgpsZXQgciBpID0KICAgIG1hdGNoIChpICUgMywgaSAlIDUpIHdpdGgKICAgIHwgKDAsIDApIC0+ICJGaXp6QnV6eiIKICAgIHwgKDAsIF8pIC0+ICJGaXp6IgogICAgfCAoXywgMCkgLT4gIkJ1enoiCiAgICB8IF8gICAgICAtPiBzdHJpbmcgaQoKCmxldCBmaXp6YnV6el91IGkgayA9CiAgICBwcmludGZuICJjYWxsIGZpenpidXp6X3UgJUEiIGkKICAgIGlmIGkgJSAxNSA9IDAgdGhlbiAiRml6ekJ1enoiIGVsc2UgayBpCgpsZXQgZml6el91IGkgayA9CiAgICBwcmludGZuICJjYWxsIGZpenpfdSAlQSIgaQogICAgaWYgaSAlIDMgPSAwIHRoZW4gIkZpenoiIGVsc2UgayBpCgpsZXQgYnV6el91IGkgayA9CiAgICBwcmludGZuICJjYWxsIGJ1enpfdSAlQSIgaQogICAgaWYgaSAlIDUgPSAwIHRoZW4gIkJ1enoiIGVsc2UgayBpCgpsZXQgdSBpID0KICAgIGZpenpidXp6X3UgaSAoZnVuIGkgLT4KICAgIGZpenpfdSBpIChmdW4gaSAtPgogICAgYnV6el91IGkgKGZ1biBpIC0+CiAgICBzdHJpbmcgaQogICAgKSkpCiAgICAKICAgIApbPEVudHJ5UG9pbnQ+XQpsZXQgbWFpbiBfID0KICAgIGxldCBwciBzIHQgPSBsZXQgeCA9IHQgMTIgaW4gcHJpbnRmbiAiJXMgLi4uICVBIiBzIHgKICAgIHByICJmIiBmIAogICAgcHIgImciIGcKICAgIHByICJoIiBoCiAgICBwciAicCIgcAogICAgcHIgInEiIHEKICAgIHByICJyIiByCiAgICBwciAidSIgdQogICAgMAo=