Skip to content

Instantly share code, notes, and snippets.

@nobsun
Last active September 26, 2017 21:00
Show Gist options
  • Save nobsun/d4af2a3bc2f881e178306cfd555f66d7 to your computer and use it in GitHub Desktop.
Save nobsun/d4af2a3bc2f881e178306cfd555f66d7 to your computer and use it in GitHub Desktop.
「FizzBuzzクイズ」クイズ - Haskell版? ref: http://qiita.com/nobsun/items/285f208a17285953f2ab
{-# LANGUAGE TupleSections #-}
module FizzBuzz where
import Data.Bool
{- |
>>> gFB (fizz.buzz) 1
"1"
>>> gFB (fizz.buzz) 3
"Fizz"
>>> gFB (fizz.buzz) 5
"Buzz"
>>> gFB (fizz.buzz) 15
"FizzBuzz"
>>> gFB (buzz.fizz) 15
"BuzzFizz"
>>> gFB (fizz.buzz.pezz) 7
"Pezz"
>>> gFB (fizz.buzz.pezz) 21
"FizzPezz"
>>> gFB (fizz.buzz.pezz) 35
"BuzzPezz"
>>> gFB (fizz.buzz.pezz) 105
"FizzBuzzPezz"
>>> gFB (fizz.pezz.buzz) 105
"FizzPezzBuzz"
>>> gFB (pezz.buzz.fizz) 105
"PezzBuzzFizz"
>>> gFB (fizz.buzz.pezz) 1
"1"
>>> gFB (fizz.buzz.pezz) 3
"Fizz"iz
>>> gFB (fizz.buzz.pezz) 5
"Buzz"
>>> gFB (fizz.buzz.pezz) 15
"FizzBuzz"
>>> gFB (buzz.fizz.pezz) 15
"BuzzFizz"
>>> gFB (fizz.buzz.pezz) 104
"104"
-}
gFB :: ((Int, String) -> (Int, String)) -> Int -> String
gFB f = fin . f . (,"")
fin :: (Int, String) -> String
fin (n, s) = bool s (show n) (null s)
unit :: (Int, String) -> (Int, String) -> (Int, String)
unit (m, s) (n, t) = bool (n, t) (n, s ++ t) (n `mod` m == 0)
fizz :: (Int, String) -> (Int, String)
fizz = unit (3, "Fizz")
buzz :: (Int, String) -> (Int, String)
buzz = unit (5, "Buzz")
pezz :: (Int, String) -> (Int, String)
pezz = unit (7, "Pezz")
module FizzBuzz2 where
import Data.Bool
type FizzBuzz a = Int -> a
(|.|) :: FizzBuzz (b -> c) -> FizzBuzz (a -> b) -> FizzBuzz (a -> c)
f |.| g = (.) <$> f <*> g
unit :: Int -> String -> FizzBuzz ShowS
unit m s n = bool id (s++) (0 == mod n m)
fizz :: FizzBuzz ShowS
fizz = unit 3 "Fizz"
buzz :: FizzBuzz ShowS
buzz = unit 5 "Buzz"
pezz :: FizzBuzz ShowS
pezz = unit 7 "Pezz"
gFB :: FizzBuzz ShowS -> Int -> String
gFB f n = bool str (show n) (null str)
where
str = f n ""
{- ^
>>> gFB (fizz|.|buzz) 1
"1"
>>> gFB (fizz|.|buzz) 3
"Fizz"
>>> gFB (fizz|.|buzz) 5
"Buzz"
>>> gFB (fizz|.|buzz) 15
"FizzBuzz"
>>> gFB (buzz|.|fizz) 15
"BuzzFizz"
>>> gFB (fizz|.|buzz|.|pezz) 7
"Pezz"
>>> gFB (fizz|.|buzz|.|pezz) 21
"FizzPezz"
>>> gFB (fizz|.|buzz|.|pezz) 35
"BuzzPezz"
>>> gFB (fizz|.|buzz|.|pezz) 105
"FizzBuzzPezz"
>>> gFB (fizz|.|pezz|.|buzz) 105
"FizzPezzBuzz"
>>> gFB (pezz|.|buzz|.|fizz) 105
"PezzBuzzFizz"
>>> gFB (fizz|.|buzz|.|pezz) 1
"1"
>>> gFB (fizz|.|buzz|.|pezz) 3
"Fizz"
>>> gFB (fizz|.|buzz|.|pezz) 5
"Buzz"
>>> gFB (fizz|.|buzz|.|pezz) 15
"FizzBuzz"
>>> gFB (buzz|.|fizz|.|pezz) 15
"BuzzFizz"
>>> gFB (fizz|.|buzz|.|pezz) 104
"104"
-}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment