「すごいErlangゆかいに学ぼう!」3章の途中
「すごいErlangゆかいに学ぼう!」の読書メモ。
今日は、3章のガードからcase ... ofまで。
ガード
ガードの意味と役割が本文に明記されていないようなのだけど(文脈からわかるよねということかも)、ガードとはパターンマッチの事前条件を書くものだと理解した。
ガード式では、成功時にtrueを返す式を書く。ユーザが独自に定義した関数を書くことはできない。
ガード式の中で、カンマはandalso、セミコロンはorelseと同じように振る舞うが、次のような違いがある。
_ | カンマ, セミコロン | andalso, orelse |
---|---|---|
例外 | キャッチする | キャッチしない |
入れ子 | できない | できる |
If節
他の言語でいうIfとErlangのIfはまったく別物らしい。本文ではIf式ともIf節とも書かれている。何が節で何が式なのか、よくわからない。
Ifとは、「ガードのように振る舞うもの」らしい。ガードパターンとも呼ばれる、という記述があることから、パターン形式で書けるガードだと解釈した。
記述したどのガードパターンにも当てはまらないケースの発生は、避けなければならない。そのため、必要ならcatch-allに相当するtrueブランチを作成する。trueブランチが必要な状況で、trueブランチを書いていなくても、コンパイルはできるが警告が出る。実行時にガードパターンでカバーできない入力があると、例外が発生する。
しかし、そもそもtrueブランチ(catch-all相当のもの)が必要な書き方をするのはよくないらしい。起こりうるすべてのケースを網羅する方がよいとのこと。
In Case ... of
もし、if式がガードのようなものだとしたら、case ... ofは関数のヘッド全体のようなものだといえます。
何いってるのかよく分からない。「case ... of」は「関数のヘッド全体」?
関数、関数節、関数のヘッドというのは、どこからどこまでを指す言葉なのか、混乱してきたっぽい。
3章の終わりまで読んだけど、最後のif、case…of、関数の使い分けの話は、また次回。