駄長文ポエムになりますが……。
学んでみたものと触ったことのあるもの
- 学んでみた関数型言語: Haskell, Elm, PureScript, Lisp(Emacs), Scheme(GNU Guile), LINQ(チェーンメソッドスタイル)
- それ以前に触ったことのある言語: VisualBasic(dotnet含む), CSharp, Python, PHP, BashShell, PowerShell, JavaScript(Node.js含む)
難しいと感じたところ
学習開始当初
真っ先に思い出せるのは、オブジェクト指向、手続きや構造化の考え方でガッチガチでしたので、
「ゑ? 変数を使わないプログラミングって一体……」
というところでしょうか。
その後LINQを使いたくてちょっと関数型パラダイム(というよりラムダ式・ラムダ計算)の学習をしましたが当時21歳専門学校卒直後で就業の私には、
「ゑ? なんで関数に関数を重ねると数値になるの? さらにそれが真偽判定になぜ使えるの?」
という感覚を覚えた記憶があります。
その後の経過
時は流れて、テスト駆動開発とバージョン管理システム導入の説得ができないことを会社のせいにして転職・無職・派遣社員登録となって6年経った頃ですかね、JavaScriptがECMAの2015年規格ができてという頃でしたでしょうか。その時の派遣先でNode.jsのスクリプトを組むに当たってJavaScriptの Promise.all()
が使えない事には思い通りの逐次実行ができないことを体感して勉強して上記もろもろが何故か紐解けました。復習と再学習の機会だったのかもしれません。
さらに転機のようにUnity Engineでのゲーム開発の現場に派遣された際にPowerShellでのスクリプトを組んでいくうちに、
「あ。(動的型付けだけど)関数型パラダイムってこういうパイプライン的な処理を書く時にとてつもなく便利だな」
という感覚を覚え、ついでにその当時プロジェクトで導入していたのもあって「リアクティブプログラミング」を学んだり、ソースコードを読んで、
「はえー。LINQ(厳密には違うとは思いますが)のチェーンメソッドってこうやって使えるのか」
と漠然と理解しながらそれぞれのメソッドの処理について色々調べたり、暇を見つけたら他の関数型パラダイムの言語のチュートリアルだけでも触って理解しようという意欲はありました。そのおかげでdotNetになってしまいましたがイベントの動き方、副作用とは……が把握できたかと。
その後も紆余曲折あり、利用するエディタをAtomからSpacemacs, DOOM Emacsに移りLISPの魅力に取り憑かれてしまったので「Land of Lisp」を買ってScheme(GNU Guile)をちょっとさわったり。といったところです。
まだ語り足りないのですが、このへんで。
おまけ: 逆に今、むしろこのままで良いのかと感じていること
「全ての関数はラムダ式っぽいのでは?」
という理解です。
チャーチ数とかなんだとか考えた時に、
「数値を意識してしまうから関数の重ね合わせが理解できないのかもしれないようなきがしないでもない」
という、自分の発想ながらにも暴論なので、この思い違いが他人に関数型パラダイムを伝える時に足かせになるのではと思ったりします。
また、自分の場合は関数型パラダイムがチョトワカルと思い込み初めた辺りから数理論理学の方に没入してきてしまってるので、なおのこと自分の感じたまま伝えると混乱を招いてしまいそうと感じております。