patternMinor
The Functional FizzBuzz Kata
Viewed 0 times
functionalkatathefizzbuzz
Problem
I run a coding dojo at work. For one session I'm to showing that you can use a kata to get into a new language.
I'm using the FizzBuzz Kata to to show F# (and JavaScript) because it is short. The problem is I am very new to F# and find myself devolving to objects instead of being functional.
Thus, I would like to see better ways of doing this (using nunit):
I'm using the FizzBuzz Kata to to show F# (and JavaScript) because it is short. The problem is I am very new to F# and find myself devolving to objects instead of being functional.
Thus, I would like to see better ways of doing this (using nunit):
namespace FizzBuzzFSharp
open NUnit.Framework
module FizzBuzzer =
let FizzBuzz number =
match number with
| i when i % 3 = 0 && i % 5 = 0 -> "FizzBuzz"
| i when i % 5 = 0 -> "Buzz"
| i when i % 3 = 0 -> "Fizz"
| _ -> number.ToString()
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
[]
let WhenNumber_ThenResult(number, expected) =
Assert.AreEqual(expected, FizzBuzz(number));Solution
I think your implementation is fine. I might write it like this, because I find it more idiomatic in F# to avoid guards (
There are ways you can make this more elaborate / extensible but while that can be an interesting exercise I don't think they're really an improvement over a simple straightforward implementation like this.
when clauses) in pattern matching where a guard free implementation is equally concise.let fizzbuzz x =
match (x % 5, x % 3) with
| (0, 0) -> "FizzBuzz"
| (0, _) -> "Buzz"
| (_, 0) -> "Fizz"
| _ -> string x
[1..100] |> List.map fizzbuzz |> List.iter (printfn "%s")There are ways you can make this more elaborate / extensible but while that can be an interesting exercise I don't think they're really an improvement over a simple straightforward implementation like this.
Code Snippets
let fizzbuzz x =
match (x % 5, x % 3) with
| (0, 0) -> "FizzBuzz"
| (0, _) -> "Buzz"
| (_, 0) -> "Fizz"
| _ -> string x
[1..100] |> List.map fizzbuzz |> List.iter (printfn "%s")Context
StackExchange Code Review Q#64871, answer score: 4
Revisions (0)
No revisions yet.