F# で FizzBuzz を書いてみた。F# らしくないコードなんだろうと思いつつ・・・。
これから文法を覚えつつ、改良してみようかな。

let FizzBuzz x y =
  for i = x to y do
    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

if を match に変えてみた。

let FizzBuzz x y =
  for i = x to y do
    match i with
    | x when x % 3 = 0 && x % 5 = 0 -> printfn "Fizz Buzz"
    | x when x % 3 = 0 -> printfn "Fizz"
    | x when x % 5 = 0 -> printfn "Buzz"
    | x -> printfn "%d" x

開始値と終値は、必要な仕様ではなかったな。

for を再帰にしてみた。

let FizzBuzz x y =
  let rec func a b =
    match a with
    | a when a > b ->
      0
    | a when a % 3 = 0 && a % 5 = 0 ->
      printfn "Fizz Buzz"
      func (a + 1) b
    | a when a % 3 = 0 ->
      printfn "Fizz"
      func (a + 1) b
    | a when a % 5 = 0 ->
      printfn "Buzz"
      func (a + 1) b
    | a ->
      printfn "%d" a
      func (a + 1) b
  func x y

入力、判定、出力を分けてみた。

#light

let FizzBuzz x =
  match x with
  | x when x % 3 = 0 && x % 5 = 0 ->
    "Fizz Buzz"
  | x when x % 3 = 0 ->
    "Fizz"
  | x when x % 5 = 0 ->
    "Buzz"
  | x ->
    sprintf "%d" x

[<EntryPoint>]
let main (args: string[]) =
  [1..15] |> List.map (fun x -> FizzBuzz x) |> printfn "%A"
  0