Search on the blog

2011年4月17日日曜日

Haskell勉強記(4)

またまたHaskell。
今日のテーマは以下。
  1. guard
  2. case expression
これが使えれば、それっぽいHaskellのコードが書ける(気がする。)

まずは、guardから。
guardは、パターンマッチに似ていますが、パターンマッチとは異なり任意の形で関数のマッチングができます。以下にguardを利用したfizz buzzを書きます。


main = putStr $ unlines $ map fizzBuzz [1..100]
where fizzBuzz x
            | x `mod` 3 == 0 && x `mod` 5 == 0 = "fizz buzz"
            | x `mod` 3 == 0                 = "fizz"
            | x `mod` 5 == 0                 = "buzz"
            | otherwise                         = show x


|と=の間がguardです。ここに条件式を書きます。上から順に操作され、trueとなったら式が対応する評価されます。otherwiseは、Preludeで定義されている式で、その値Trueだそうです。

次にcase expression。guardを使うと任意の式でパターンマッチができますが、引数に対する条件式(上の場合はx)に対する条件式しか書けません。
case expressionを使用すると、引数を成形したものに対してマッチングをかけることができます。fizz buzzを書くと下のようになります。


main = putStr $ unlines $ map fizzBuzz [1..100]
where fizzBuzz x = case [x `mod` 3, x `mod` 5] of
                    [0, 0]     -> "fizz buzz"
                    [0, _] -> "fizz"
                    [_, 0] -> "buzz"
                    otherwise -> show x


最後に、以上をふまえて、3の倍数と3が付く数字のときだけアホになる関数を書きましょう。


main = putStr $ unlines $ map nabeatsu [1 .. 100]
where hasThree x = any (== '3') $ show x
nabeatsu x
        | x `mod` 3 == 0     = "aho" ++ " (" ++ (show x) ++ ")"
        | hasThree x     = "aho" ++ " (" ++ (show x) ++ ")"
        | otherwise            = show x


今日はここまで。

0 件のコメント:

コメントを投稿