「すごい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、関数の使い分けの話は、また次回。