先日、オブジェクト指向の弱点から関数型プログラミングの流行へ、という流れを解説するYouTubeの動画を見ていました。ふむふむと聞いていたら、話者自身も何度も挫折していて、いまもなお挫折しているという話になって、思わずずっこけました。2015年くらいに大学で関数型が流行っていたという話もあって、めっちゃ最近じゃん、と。Haskellの策定が始まったのは1987年で、自分とほぼ同い年。こんなところからもちょっと親近感がわきます。
同じ日の昼には、関数型プログラミングの解説動画も見ていました。関数型プログラミングと、Haskellのような純粋関数型の言語とではまたちょっと違うのかもしれませんが、利点としてよく挙がるイミュータブルとか副作用とか、それこそ2015年周辺でReact界隈で盛り上がっていた記憶があります。
その時は完全に挫折して、jQueryで手続き型な書き方を続けていました。でも解説を見ていて思い出したのは、その「なんとなく」使い回しが利くように抽象化した関数を作るのが自然になっていて、内部でごちゃごちゃ状態を持ってやるみたいな書き方を気持ち悪く感じるようになっていたことでした。名前とか概念とかこそ頭に入っていなかったけど、リーダブルコードとかベストプラクティスとかをちょこちょこつまみ食いしていたところが、実は知らず知らずのうちに実務でも役に立つ形でにじみ出てきていたのかも。そうか、その頃からJSよりもPHPを書くことが多くなってきたからかな、とも思います。
それからWebで公開されているLearn You a Haskell for Great Good!をブラウザのページ翻訳で読んでみたんですが、これが思いのほかつらい。英語の語順がそのまま日本語に直訳されるせいで、文中のインラインのコードブロックが本来の位置から前後に飛んでしまうんです。ただでさえ難解なのに、さらに難解に感じてしまって、これは日本語の本を買った方が良さそうだな、と。
それで数日後には『すごいHaskellたのしく学ぼう!』を買っていました。イントロダクションを読んでみると、ページ翻訳よりやっぱりスッと頭に入ってきます。買って良かったかも。関数型プログラミングって、ホントに命令じゃなくて「定義」みたいな感じなんですね。何をするかじゃなくて、何であるか。
翌朝は布団の中で続きを読んでいました。なるほど、遅延評価。副作用がなく、一度定義した変数は変わらない。結果が変わらないと分かっているから、本当に必要になるまで評価しない。……って、結果が分かってるなら最初から答えを書いた方が良いのでは? と思ったりもして。この関数とこの関数の組み合わせの時、とか考え出すと、一個ずつ計算していくのが大変だからかな。
まだラムダ式がちょっと分かるくらいで、関数型のなんたるかは全然見えていません。それでも、自分の中の「なんとなく」がちょっと減って、レベルが上がっていくようなそんな感覚があって楽しいです。