三ヶ月間のHaskellセミナーを終えて

Haskellセミナーについて

本年度から学部三年になり、研究室に配属された。私の研究室では、関数型言語を用いて卒業研究を行うことになっており、学部三年生は基礎としてHaskellの学習をすることになっている。
特に前期は、「プログラミングHaskell」という本を教材にして、指導教員と学生で週一でセミナーを行った。

プログラミングHaskell

プログラミングHaskell

セミナーの内容としては

  • 課題として、本の各章の最後の練習問題を解き、次章の内容を読んでくる。
  • セミナーの時間に、自分が担当した練習問題の解答を皆に解説する。また、読んできた章の内容についてわからないことがあれば、教員に質問する。
  • 練習問題の解答と次章の内容に対しての疑問が無くなれば、セミナーの終わりに、次の練習問題を学生に割り振る。

というものだった。
個人的には、どうすれば自分の解答が理解してもらえるかを考え、資料を作成する力をある程度付けることができたと思う。また、自分の解答に対して他の学生や教員から質問が飛んでくるので、違う解法や自分の理解は正しいかを確認することができ、さらに理解を深めることができて良かった。

プログラミングHaskellの内容について

教材として使用したプログラミングHaskellを読んだ感想を書く。本としては全体で13章で構成されているが、セミナーで行った12章までの内容しか書かないことはご了承頂きたい。

1-4章

命名規則や基本的な式は各言語で異なるため、そこは覚えるしかないと思う。
個人的に興味深い内容は、カリー化だった。カリー化された関数を部分適用することで、有益な関数を作ることができることが面白いと感じた。
また、1章でクイックソートが5行で書けると知った時は、衝撃を受けた。

5-7章

リスト内包表記自体はPythonなどでも取り入れられているが、自分は初めて知った書き方だった。簡潔にリストを定義することができて便利。
6章では、Haskell再帰関数を定義するコツを記載されていて、この章以降で再帰関数を書く時に役に立った。
7章の高階関数では、畳込関数foldr, foldlの仕組みを理解することがとても難しかった。今も何となくで理解しているため、詳しく理解したい時は読み返したいと思う。 この本のfoldr, foldlの解説はわかりやすいという意見もあるので、自分の理解力が足りないだけかもしれない。

taiju.hatenablog.com

これは本の内容とは関係ないのだが、教員から教えてもらった再帰関数を読む時のコツを紹介したいと思う。再帰関数は、再帰部の中身を掘り下げて読むのではなく、その再帰部が正しく動作すると仮定して、基底部で再帰が止まるかを考えた方が読む効率が良いというものである。自分は、実際にこの思考を用いることで、再帰関数が異なって見えるようになった。

8-9章

  • パーサー
  • 対話プログラム

8章では、実際にパーサーに必要な関数を実装していく。最初、パーサの連結や選択の実装が理解できず、パーサーがどうして正しく動作するかが理解できていなかった。しかし、一旦理解ができるようになると、パーサーを組み上げることができて楽しかった。
9章では、アクションとHaskellでの入出力の実装が紹介されている。 8章が理解できれば、ここも理解することは難しくないと思う。

10-12章

  • 型とクラスの定義
  • 切符番号遊び
  • 遅延評価

10章では、新しい型やクラスの定義方法が紹介されている。Haskell再帰型を定義することができることを用いて、木構造や数式を処理する仮想マシンなどを実装している。
11章では、切符番号遊びを解くプログラムを実装する。演算のための型を新しく定義し、総当たりで解を求める。最初は効率は無視して実装するが、代数的な性質などを利用して、プログラムの効率を上げていく様子を見ることができて面白かった。
12章では、Haskellの評価戦略について解説している。以前からHaskellは遅延評価であると聞いたことはあったが、遅延評価自体を詳しく知らなかった。この章では、評価戦略について詳しく解説されており、遅延評価とは何か知ることができて面白かった。

まとめ

この本では、Haskellの機能やパーサーなどを作成するための思考, 関数が丁寧に解説されていて良かった。また、本の内容に従って実装すれば、自分でシーザー暗号解読器, 数式パーサー, 数式パーサーを用いたCUI電卓プログラム, CUIライフゲーム, 切符番号遊びなどが実装できるのも良い点だと感じた。解説だけがずっと記載されていると、 本を読むこと自体に飽きたりするが、実際にコードを書くことで、何かプログラムを動作させることができるのは楽しかった。

今後

後期にもまたセミナーを開いて下さる予定なので、そちらを頑張っていきたい。内容としては、プログラミングHaskellには記載されていなかったモナドのより深い概念やFRPについてやるらしいので楽しみである。大学の夏季休業で後期まで大分時間が空いてしまうので、セミナーの内容を時々復習して、Haskellについて忘れないようにしたい。