12/04/15 16:42:00.03
F#でThreadLocal等の副作用もないバージョン。
type MainBuilder() =
member this.Return x =
x |> List.map (function
| _, Some names -> box names
| number, None -> box number)
let main = MainBuilder()
let makeFizzBuzz name condition (x : obj) =
match x with
| :? int as number -> number, if condition number then Some name else None
| _ ->
let number, names = x :?> int * string option
number, if condition number then (defaultArg names "") + name |> Some else names
// fizz, buzz, gizzの定義は>>341と同じなので省略
> main { return [1; 3; 5; 7; 15; 21; 35; 105] |> List.map (fun x -> gizz(buzz(fizz x))) };;
val it : obj list =
[1; "Fizz"; "Buzz"; "Gizz"; "FizzBuzz"; "FizzGizz"; "BuzzGizz"; "FizzBuzzGizz"]