2012年8月9日木曜日

Haskellことはじめ fizzbuzz

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
disられているらしいizzbuzzですが、どんな言語か知るために手をつけ始めるときにはよい課題かと思います。何事もそうですが目的にかなっているかどうかです。

izzbuzz :: Int -> String
fizzbuzz n | (n `mod` 15) == 0 = "fizzbuzz"
        | (n `mod` 3) == 0 = "fizz"
        | (n `mod` 5) == 0 = "buzz"
        | otherwise =  show n

main = do
  print $ map fizzbuzz [1,2 .. 20]
showによってprintの前に型の情報がつぶされているので気に入らなかった。で・・・・eitherとかmaybeってものがある。これをつかうとfizzbuzz関数が返す型が本質的に記述できる
fizzbuzz :: Int -> Either String Int
fizzbuzz n | (n `mod` 15) == 0 = Left "fizzbuzz"
        | (n `mod` 3) == 0 = Left "fizz"
        | (n `mod` 5) == 0 = Left "buzz"
        | otherwise = Right n

main = do
  print $ map fizzbuzz [1,2 .. 20]
ありがちな無限列を返すという形にしてみる。
fizzbuzz :: Int -> Either String Int
fizzbuzz n | (n `mod` 15) == 0 = Left "fizzbuzz"
        | (n `mod` 3) == 0 = Left "fizz"
        | (n `mod` 5) == 0 = Left "buzz"
        | otherwise = Right n

fizzbuzzStream :: [Either String Int]
fizzbuzzStream = map fizzbuzz [1,2 ..]

main = do
  print $ take 20 fizzbuzzStream
"/ \$"を消去とか清書。
fizzbuzz :: Int -> Either String Int
fizzbuzz n
  | n `mod` 15 == 0 = Left "fizzbuzz"
  | n `mod` 3 == 0 = Left "fizz"
  | n `mod` 5 == 0 = Left "buzz"
  | otherwise = Right n

fizzbuzzStream :: [Either String Int]
fizzbuzzStream = map fizzbuzz [1,2 ..]

main = do
  print $ take 20 fizzbuzzStream

0 件のコメント: