fork download
  1.  
  2. let fizzbuzz i =
  3. printfn "call fizzbuzz %A" i
  4. if i % 15 = 0 then Some("FizzBuzz") else None
  5.  
  6. let fizz i =
  7. printfn "call fizz %A" i
  8. if i % 3 = 0 then Some("Fizz") else None
  9.  
  10. let buzz i =
  11. printfn "call buzz %A" i
  12. if i % 5 = 0 then Some("Buzz") else None
  13.  
  14.  
  15. type OptBuilder() =
  16. member self.Bind (s, f) =
  17. match s with
  18. | None -> f()
  19. | _ -> s
  20. member self.Return x = Some(x)
  21.  
  22. let opt = new OptBuilder()
  23.  
  24. let f i =
  25. opt {
  26. do! fizzbuzz i
  27. do! fizz i
  28. do! buzz i
  29. return (string i)
  30. }
  31.  
  32.  
  33. let (<||>) a b =
  34. match a with
  35. | None -> b
  36. | _ -> a
  37.  
  38. let g i = fizzbuzz i <||> fizz i <||> buzz i <||> Some(string i)
  39.  
  40.  
  41. let (|FizzBuzz|_|) i = fizzbuzz i
  42. let (|Fizz|_|) i = fizz i
  43. let (|Buzz|_|) i = buzz i
  44. let (|Else|) i = string i
  45.  
  46. let h i =
  47. match i with
  48. | FizzBuzz(s) -> s
  49. | Fizz(s) -> s
  50. | Buzz(s) -> s
  51. | Else(s) -> s
  52.  
  53.  
  54. let p i =
  55. match i with
  56. | _ when i % 15 = 0 -> "FizzBuzz"
  57. | _ when i % 3 = 0 -> "Fizz"
  58. | _ when i % 5 = 0 -> "Buzz"
  59. | _ -> string i
  60.  
  61.  
  62. let q i =
  63. if i % 15 = 0 then
  64. "FizzBuzz"
  65. elif i % 3 = 0 then
  66. "Fizz"
  67. elif i % 5 = 0 then
  68. "Buzz"
  69. else
  70. string i
  71.  
  72.  
  73. let r i =
  74. match (i % 3, i % 5) with
  75. | (0, 0) -> "FizzBuzz"
  76. | (0, _) -> "Fizz"
  77. | (_, 0) -> "Buzz"
  78. | _ -> string i
  79.  
  80.  
  81. let fizzbuzz_u i k =
  82. printfn "call fizzbuzz_u %A" i
  83. if i % 15 = 0 then "FizzBuzz" else k i
  84.  
  85. let fizz_u i k =
  86. printfn "call fizz_u %A" i
  87. if i % 3 = 0 then "Fizz" else k i
  88.  
  89. let buzz_u i k =
  90. printfn "call buzz_u %A" i
  91. if i % 5 = 0 then "Buzz" else k i
  92.  
  93. let u i =
  94. fizzbuzz_u i (fun i ->
  95. fizz_u i (fun i ->
  96. buzz_u i (fun i ->
  97. string i
  98. )))
  99.  
  100.  
  101. [<EntryPoint>]
  102. let main _ =
  103. let pr s t = let x = t 12 in printfn "%s ... %A" s x
  104. pr "f" f
  105. pr "g" g
  106. pr "h" h
  107. pr "p" p
  108. pr "q" q
  109. pr "r" r
  110. pr "u" u
  111. 0
  112.  
Success #stdin #stdout 0.06s 134720KB
stdin
Standard input is empty
stdout
call fizzbuzz 12
call fizz 12
f ... Some "Fizz"
call fizzbuzz 12
call fizz 12
call buzz 12
g ... Some "Fizz"
call fizzbuzz 12
call fizz 12
h ... "Fizz"
p ... "Fizz"
q ... "Fizz"
r ... "Fizz"
call fizzbuzz_u 12
call fizz_u 12
u ... "Fizz"