I wanted to check out different stacks recently. The goal is to pick an interesting new language and go deep on some aspects of it – understanding how to implement a simple web server with or without the language-specific framework. The main thing is to implement everything in TDD.
I had a brief look at Haskell in mid last year. It was really weird and mind-blowing when I first got to know Haskell. I had always planned to revisit the language, so I did it. Here is my Fizzbuzz kata implementation using the Haskell stack.
https://github.com/suryast/fizzbuzz-hs
module FizzBuzzSpec (spec) where
import Test.Hspec
import FizzBuzz
spec :: Spec
spec =
describe "fizzBuzz" $ do
it "should print fizz if divisable by 3" $
-- | Given
let input = 3
expected = "fizz"
-- | When
actual = fizzBuzz input
-- | Then
in actual `shouldBe` expected
it "should print the input if not divisable by 3 or 5" $
-- | Given
let input = 4
expected = "4"
-- | When
actual = fizzBuzz input
-- | Then
in actual `shouldBe` expected
it "should print buzz if not divisable by 5" $
-- | Given
let input = 5
expected = "buzz"
-- | When
actual = fizzBuzz input
-- | Then
in actual `shouldBe` expected
it "should print fizzbuzz if not divisable by 15" $
-- | Given
let input = 15
expected = "fizzbuzz"
-- | When
actual = fizzBuzz input
-- | Then
in actual `shouldBe` expected
module FizzBuzz where
fizzBuzz :: Int -> [Char]
fizzBuzz input = if fizz(input) ++ buzz(input) == ""
then show input
else fizz(input) ++ buzz(input)
fizz :: Int -> [Char]
fizz input = if mod input 3 == 0 then "fizz" else ""
buzz :: Int -> [Char]
buzz input = if mod input 5 == 0 then "buzz" else ""
Setting up the Haskell’s Stack/Cabal stack was quite time-consuming, and it took the most time. Learning about the syntax and how to write tests using Hspec was quite exciting otherwise. I am quite keen to learn more about Haskell in the future.