変形Fizz-Buzz問題
Posted feedbacks - Haskell
無限リストを使って、明示的条件判断無しでやってみました。 showItのところは zipWith4 (printf "%2d: %s%s%s") [1..] fizz buzz hoge だと型が推測できんと怒られた。そういうもの?
1 2 3 4 5 6 7 8 9 10 11 12 | import Data.List
import Text.Printf
fizzbuzz = zipWith4 showIt [1..] fizz buzz hoge
where showIt :: Int->[Char]->[Char]->[Char]->[Char]
showIt = printf "%2d: %s%s%s"
fizz = ["","","Fizz"]++fizz
buzz = ["","","","","Buzz"]++buzz
hoge = ["hoge","hoge","","hoge","","","hoge","hoge",
"","","hoge","","hoge","hoge",""]++hoge
main = putStr $ unlines $ take 20 $ fizzbuzz
|
ああ、[1..]の型が曖昧なのがprintfの型情報からだけでは解決できないってことなのかな。 こうしたら通った。
1 2 3 4 5 6 7 8 9 10 | import Data.List
import Text.Printf
fizzbuzz = zipWith4 (printf "%2d: %s%s%s") ([1..]::[Int]) fizz buzz hoge
where fizz = ["","","Fizz"]++fizz
buzz = ["","","","","Buzz"]++buzz
hoge = ["hoge","hoge","","hoge","","","hoge","hoge",
"","","hoge","","hoge","hoge",""]++hoge
main = putStr $ unlines $ take 20 $ fizzbuzz
|
elseを書かないifを作ってしまいました。
1 2 3 4 5 6 7 8 9 10 11 12 13 | module Main (main) where
main = mapM_ putStrLn [show x ++ ":" ++ fizzBuzz x | x <- [1..10]]
fizzBuzz x = nif (isFizzBuzz x) "FizzBuzz" $ nif (isFizz x) "Fizz" $ nif (isBuzz x) "Buzz" "hoge"
isFizzBuzz x = (ntrue : replicate 14 nfalse) !! (x `mod` 15)
isFizz x = (ntrue : replicate 2 nfalse) !! (x `mod` 3)
isBuzz x = (ntrue : replicate 4 nfalse) !! (x `mod` 5)
ntrue x y = x
nfalse x y = y
nif x f g = x f g
|
Control.Monad.whenを使う
1 2 3 4 5 6 7 8 9 10 11 12 | import Control.Monad
import Text.Printf
fizzs = tail $ cycle $ take 3 $ "Fizz": repeat ""
buzzs = tail $ cycle $ take 5 $ "Buzz": repeat ""
main = mapM_ (uncurry printing)
$ take 20
$ zip [1::Int ..]
$ zipWith (++) fizzs buzzs
printing n s = printf "%2d: " n >> when (s == "") (putStr "hoge") >> putStrLn s
|
1 と書いただけでは、Num クラスのどのインスタンスか分らないんです ghciのプロンプトで型を確かめて見るとわかります Prelude> :type 1 1 :: (Num t) => t




raynstard
#3758()
Rating0/2=0.00
[ reply ]