Page List

Search on the blog

2011年4月17日日曜日

Haskell勉強記(4)

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

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

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


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

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

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


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

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


今日はここまで。

0 件のコメント:

コメントを投稿