FizzBuzz in Haskell

Problem statement

Write a program that prints the numbers from 1 to 100. But for multiples of three print “Fizz” instead of the number and for the multiples of five print “Buzz”. For numbers which are multiples of both three and five print “FizzBuzz”.

Solution

--Tells us if x is divisible by y
divby :: (Integral x) => x -> x -> Bool
divby x y =
	(x `mod` y) == 0

--Internal function that returns output for a single number
isfizzbuzz :: (Integral x) => x -> String
isfizzbuzz x
	| divby x 3 &&  divby x 5 = "FizzBuzz"
	| divby x 3 = "Fizz"
	| divby x 5 = "Buzz"
	| otherwise = show x

--Method that returns FizzBuzz output on a list of numbers
fizzbuzz :: (Integral x) => [x] -> [String]
fizzbuzz x =
	map isfizzbuzz x

As WordPress does not support Haskell source formatting I have opted to format the code as Erlang so you will see some strange highlighting above.

You can also view the code here on GitHub Gists.

Sample output

fizzbuzz [1..100]
[“1”, “2”, “Fizz”, “4”, “Buzz”, “Fizz”, “7”, “8”, “Fizz”, “Buzz”, “11”, “Fizz”, “13”, “14”, “FizzBuzz”, “16”, “17”, “Fizz”, “19”, “Buzz”, “Fizz”, “22”, “23”, “Fizz”, “Buzz”, “26”, “Fizz”, “28”, “29”, “FizzBuzz”, “31”, “32”, “Fizz”, “34”, “Buzz”, “Fizz”, “37”, “38”, “Fizz”, “Buzz”, “41”, “Fizz”, “43”, “44”, “FizzBuzz”, “46”, “47”, “Fizz”, “49”, “Buzz”, “Fizz”, “52”, “53”, “Fizz”, “Buzz”, “56”, “Fizz”, “58”, “59”, “FizzBuzz”, “61”, “62”, “Fizz”, “64”, “Buzz”, “Fizz”, “67”, “68”, “Fizz”, “Buzz”, “71”, “Fizz”, “73”, “74”, “FizzBuzz”, “76”, “77”, “Fizz”, “79”, “Buzz”, “Fizz”, “82”, “83”, “Fizz”, “Buzz”, “86”, “Fizz”, “88”, “89”, “FizzBuzz”, “91”, “92”, “Fizz”, “94”, “Buzz”, “Fizz”, “97”, “98”, “Fizz”, “Buzz”]

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s