概要
「プログラミングの基礎」を読みました。 「前提(関数型プログラミングの経験、目的、読了時間)」「感想」「次に関数型プログラミング or ComputerScience で勉強すること」「まとめ」を記述します。
前提
関数型プログラミングの経験
関数型プログラミングの経験はほとんどなく、TypeScript や React の構文に関数型プログラミングの思想が入っていることを認識しているぐらいでした。 第一級関数、パターンマッチ、カリー化などの単語は一応しっていますが、適切な理解もなければ意識して使用したこともありませんでした。
目的
以下の効果を得られることを目的に読み始めました。
- 関数型プログラミングを理解するきっかけにする
- OCaml などの関数型(に特化した)言語を使うのは初めてだった
- 関数型の書き方を学ぶ
- 月に 1 回 ComputerScience の勉強をしたいので、今月の 1 冊にした
読了時間
GW 中に 7 日間ぐらいかけて、17 章までしっかり読み 18 章から 24 章は流し読みしました。 本書の最終目標である「メトロネットワーク最短経路問題」はちゃんと読むと時間がかかりそうだったので、途中から飛ばしています。 1 日にかけた時間は 2 時間から 3 時間ぐらいです。 「メトロネットワーク最短経路問題」もしっかりと読む場合は、より多くの時間が必要です。
OCaml の環境構築(Mac OS)には、以下の zenn の記事を参考にしました。
本書にはサポートページが用意されているので、演習問題を解いた後やわからなかったときに使用しました。
感想
目的通り、「関数型プログラミングを理解するきっかけ」になりました。 プログラミング初学者向けにも記述してあるので、わかりやすい言葉で丁寧に解説してくれます。 なので、主に以下の点において知見を深めることができました。
- 適切な再帰関数の定義方法
- 一般化と高階関数について
- 頻繁に使用される map、filter の内部実装について
- 簡単なアルゴリズム(ソート、木構造)を関数型プログラミングで記述する方法
特に再帰関数は書籍を読むまで、メリットを感じられず敬遠していました。 書き方を知らなかったので、無限ループに落ち入りがちだったのも理由です。 しかし、パターンマッチ、停止方法、部分問題、分割統治法、といった適切な記述方法を学び、再帰を使いこなせばより綺麗なプログラミングができると考えが変化しました。 普段意識せずに使用していた関数も関数型プログラミングの設計が含まれていたことに気がつき、今後は関数型プログラミング意識して実践したいという気持ちになれました。
他にも、個人的な問題ですが、自身のアルゴリズム周辺の知識が弱い意識を持っています。 それらを再帰関数で記述した際の実装方法は命令型の言語よりも簡潔になり、理解する一助になったと思いました。
「メトロネットワーク最短経路問題」はダイクストラ法を用いたメトロの最短経路を求める問題です。 本書で学んだ内容を実世界の問題に対して落とし込んだ内容です。 段階を踏みながら進行していくので、わからなくても解説を見れば納得しながら進めることができます。 ただ、徐々に問題の難易度が上がっていくので、時間がかかるようになります。 この本を長い期間をかけて完全に理解するのであれば、解くことを推奨します。 しかし、自分みたいに主目的が他の部分にあるのならば、ある程度飛ばしてもいいと思いました。
他に思ったことは、欠点というほどではないのですが、まったくの初学者がプログラミングを独学で学ぶ 1 冊目の本には向いていないと思いました。 大学の教科書にも使われる本なので、授業で ComputerScience よりのプログラミングやアルゴリズムを学ぶには非常に向いていると考えています。 あくまで、機械学習や Web プログラミングに興味がある初学者に薦める本ではないという意味です。 その場合、一旦それらに適したプログラミング言語を学んでから、「関数型プログラミングを基礎から学びたい」「プログラミング自体を学びたい」というニーズに応えられる本だと思いました。
次に関数型プログラミング or ComputerScience で勉強すること
関数型プログラミングを実践したり他の書籍も読みたいですが、他の ComputerScience の本も読む方を優先する予定です。
関数型プログラミングでやること
- 実務のプログラミングで実践する
- TypeScript も使用しているので、関数型プログラミングぽく書き直したい
- 他の関数型プログラミングの本にも挑戦してみる
- 「Functional Programming in Kotlin」「Domain Modeling Made Functional」あたりが気になる
ComputerScience でやること
まとめ
- 丁寧な解説で関数型プログラミングの基本を学ぶことができた
- 「メトロネットワーク最短経路問題」は飛ばしたがそれでもよかった
- 再帰関数について適切な理解を深めることができた
- 関数型プログラミングを実践したい気持ちになれた
- 次に勉強するのは、関数型プログラミングを深堀するのではなく、他の ComputerScience を学ぶ予定