関数プログラミング入門 Haskell で学ぶ原理と技法 の読書メモです。

本節は定義についてですが、前節につづき関数ともいえそうです。

内容は * ガード付等式 * 再帰定義 * 局所定義 です。

ガード式の前に関数だけじゃなく、他の値も定義できるという話がでてきますが、それ以上でもそれ以下でもないです。一般的なプログラミング言語なら定数ともいえそうです。

つづいて、ガード付等式です。ガード 付等式ガード付 等式悩みましたがたぶん後者でしょう。 まだ、登場していませんが、パターンマッチよりも細かいところで分岐させるのによく使います。数学のノートみたいに見えてよいです。一応例をだしておきます。

compare x y
  | x > y  = LEFT
  | x == y = EQUAL
  | x < y  = RIGHT

LEFT、EQUAL RIGHTの定義をしていませんが、比較して大きいほうを返す関数です。よみやすいです。このように3パターン以上に分岐する場合は if を使用するよりもよみやすくなります。

ifを使うと

compare x y = if x > y then LEFT else
                       if x == y then EQUAL else RIGHT

みたいな感じでしょう。

再帰定義

あまり文章での説明がなかったです。関数の中で自分の名前が使用できます。実際に手を動かして簡約してみると、再帰というものが存在して良いことが確認できると思います。 ただし、終了条件がなければ収束することなくどんどん大きくなります。

局所定義

関数にローカルな定数や関数を定義できます。引数から値をとってきて別の関数に引数を適用しておいて使いますなどすると便利です。 一時変数のように使えますが、当然再代入はできません。

letが登場しませんでした。複雑さを回避したのでしょうか。

練習問題

ひさしぶりに Haskellのコードをかかせてくれました。

まとめ

ガード付等式はここで登場で良いのかよくわからなかったですが、知っておくほうが便利です。それにしても、Haskellの表記は数学に近いようになってて楽しいですね。

関連