『プログラミングの基礎』をF#で解いた

リポジトリはこれ。
https://github.com/guricerin/basic-of-programing

実は1年程前にも読んだことがある。慣れないemacs使いながら素直にOCamlで問題を解いていた。まあこの時は途中で飽きたし、gitにもアップしていなかったのだけど(というかgitを使っていなかった)。

んで今回、Rustほど厳格でなく、スクリプト言語ほど型がゆるゆるではない、仕事でたまに使うC#の経験が活かせそうなF#に目をつけてみたという感じ。

ちなみにおれのエディタ変遷は、emacs -> Spacemacs -> VSCode(VSCodeVimプラグイン)となっている。Spacemacsで完全にVimに支配された。emacsキーバインドなんてもはや覚えていない。

内容について、途中まではサクサクと問題を解くことができた。しかし、最後の方では詰まることが多くなり、赤黒木やヒープの実装となると、もはや模範解答や他の人のコードをF#に翻訳するだけの作業と化していた。

特にきついのが破壊的代入を伴う副作用を書くことだ。RustはなんやかんやでC++っぽい文法なのでその気になればすんなり書けるが、F#だとどの値がどう変化しているのか把握するのにやたらと苦労する。これは、単におれがF#に慣れていないだけなのだろうか。結果として、副作用のない関数を書くことが好みになる。まあこのこと事態は良いことなのだろう。計算量やメモリ効率を度外視すればだが。

もう一つ心残りとしては、テストフレームワークを使わなかったことだろうか。本ではとにかくテストが大事だとやたらと主張していたのにも関わらず、自前でテスト用のプロジェクトを用意したり、他プロジェクトから参照させたいからとprivateであるべき関数をpublicにしてしまったり、挙げ句の果てには色々めんどくさくなってテストコードの大半を爆破させたり。だったら初めからテストフレームワーク使っておけよ、という事態になっていた。

まあでもNUnitなんて使ったことないし(!)職場の人間もたぶん誰も知らない概念なので(!!)、テストフレームワークそのものの学習に時間はかけたくないというアレな感情が発生してしまった、というのが言い訳。

F#に関してはもうちょっと触ってみようと思う。おれみたいな馬鹿がどれだけこの言語に付き合っていけるかは疑問だが、型を手軽に定義できることといい、でふぉるとでいみゅーたぶるなことといい、結構面白い言語なので、バグの少ないコードを書く技法をF#を通して会得できたらなと思う。