またまたHaskell。
今日のテーマは以下。
- guard
- 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 件のコメント:
コメントを投稿