Last active
September 26, 2017 21:00
-
-
Save nobsun/d4af2a3bc2f881e178306cfd555f66d7 to your computer and use it in GitHub Desktop.
「FizzBuzzクイズ」クイズ - Haskell版? ref: http://qiita.com/nobsun/items/285f208a17285953f2ab
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# 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") |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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