人気ブログランキング | 話題のタグを見る

RWH の読み方(22) 第3章

Real World Haskell 第3章 Defining Types, Streamlining Functions

第3章の最後の部分に到達した。特に難解なところは無いので一気に3章を終わってみる。

The case Expression

Haskell では if 文を使わずにパターンマッチで条件分岐するのが普通のやり方だが、多肢分岐をおこなう case 文でもパターンマッチを利用することができる。次の関数はRWH本文に記載された例で、Maybe型のコンテナから値を取り出す関数だ。Maybe型のデータが Just a の場合はコンテナから a を取り出し、Nothing のときはあらかじめ指定したデフォールトの値を返すようにする。

fromMaybe defval wrapped =
  case wrapped of
    Nothing -> defval
    Just value -> value

実行例

*Main> fromMaybe "default" Nothing
"default"
*Main> fromMaybe "default" (Just "wrapped")
"wrapped"

Common Beginner Mistakes with Patterns

このサブセクションでは、初心者が陥りやすいパターンを扱うときの間違いについて書いてあるが、煩雑になるので省略する。

Conditional Evaluation with Guards

Haskell では引き数の条件判断をするのにガード | を使うことができる。これをつかえば if 文を使わない条件分岐の記述ができる。次の関数は2つの引き数の大小を判別する。

myCompare x y
  | x < y = LT
  | x == y = EQ
  | otherwise = GT

ガードとパターンマッチを組み合わせると条件分岐のある関数を if 文を使わずにコンパクトに記述できる。RWH には次の3つの例があげてある。

最初は、木構造のノードの値が等しいかどうかを調べる関数 nodesAreSame

nodesAreSame (Node a _ _) (Node b _ _)
  | a == b = Just a
nodesAreSame _ _ = Nothing

上のプログラムで注意する点は、パターンマッチは上に書かれた定義から順に判別されるということだ、この例で言えば a /= b の時はパタンマッチに失敗するから nodesAreSame _ _ のパターンが試される。このパターンマッチはワイルドカードを使っているのでどんなパターンにもマッチするから a == b 以外の場合の nodeAreSame の戻値は Nothing になる。

2番目は、預金の引き出しを処理するプログラム。amount が預金の引き出し額、balance は預金残高、reserve は預金引き出しの限度額、newBalance は引き出された後の預金残高だ。

lend3 amount balance
    | amount <= 0 = Nothing
    | amount > reserve * 0.5 = Nothing
    | otherwise = Just newBalance
  where
    reserve = 100
    newBalance = balance - amount

上のコードで otherwise はガードでどんな条件でも True になる。つまり、デフォールトの処理をするためのパターンだ。

最後はリストの先頭から n 個の要素を削除する niceDrop だ。リストの長さが足りないなどの例外の処理をパターンとガードで記述している。if ~ then ~ else if ~ else ~ then などの構文を使う場合より簡潔な表現になる。

niceDrop n xs | n <= 0 = xs
niceDrop _ [] = []
niceDrop n (_:xs) = niceDrop (n - 1) (tail xs)

1行目と2行目の定義式は、再帰的定義の初期条件で、3行目の再帰的定義よりも先に定義しておく必要がある。

この節で強調されているのは、関数のパターンマッチとガードを組み合わせることで if 文のないコンパクトで可読性の高いコードが書けるということだ。

これで Real World Haskell の3章分を読み終わったことになる。ちょっと息切れしてきたので RWH ネタはしばらく休憩する。

RWH には Haskell を使う時のはっとするようなコツや洞察が散りばめられているので座右の書になるだろうが、Haskell の文法を手っ取り早く知るという用途には向いていない気がする。

Haskell の全体像をざっくりと知るには The Haskell Cheatsheet がおすすめだ。日本語訳もある。ある程度 Haskell でプログラムを作り慣れてもこの文書を読み返すと新しい発見がある。

プログで連載記事を書くのはしんどい。また、日常の取り留めのない意見を書くというブログの性質にも反してくるので、しばらくお休みにしたい。

Haskell などという怖いプログラム言語にはできるだけ近づかないようにしていた管理人が書いた記事なので、同じように Haskell には興味があるがちょっと手を出すのが億劫だなという人の役にたつことが少しでもできたらうれしい。
by tnomura9 | 2012-03-18 22:49 | Haskell | Comments(0)
<< アリーテ姫の冒険 RWH の読み方(21) 第3章 >>