関数型プログラミングを理解する方法はいろいろありますよね。ざっと検索をしてみているのですが、なかなか良い資料というのは見つかりませんが…
気になった資料をざっくりですが一覧としておきました。
- Haskell 入門 – ウォークスルー Haskell
- A Gentle Introduction to Haskell, Version 98
- Haskell入門 5ステップ – HaskellWiki
- 10分で学ぶHaskell – HaskellWiki
- プログラミング/Haskell/入門 – Flightless wing
- 射 (圏論) – Wikipedia
- Home · scalajp/introduction-to-category-theory-in-scala-jp Wiki · GitHub
- Functional JavaScript
- 関数プログラミング入門
- Rubyを使って「なぜ関数プログラミングは重要か」を読み解く(改定)─ 前編 ─ 但し後編の予定なし
- PHPでできる関数型プログラミング | Prog Blog From 憩い場所
- Functional Programming in PHP – PHP: The Right Way
- Haskellでスタックを利用した加減乗除の計算機を作ってみる — laskell 0.0.1 documentation
- Haskell の State モナド (1) – 状態を模倣する | すぐに忘れる脳みそのためのメモ
- monads Introduction
こうしてみると、PHP、JavaScript、Ruby、Javaといったよく使われているプログラミング言語にも関数型プログラミングの機能が取り込まれるようになってきていて、身近なものになってきているのは確かですね。だから、使えそうなところから使っていくというのが一番良い気がします。クロージャあたりは、みんな普通に使っていますしね。
本格的に勉強したいと思うなら、純粋関数型プログラミング言語が良いでしょうから、Haskellなのかな、とは思います。圏論から理解するというアプローチも面白いと思う人もいるかもしれませんが、数学が得意でない限り、おすすめしません。たぶん、プログラミング言語の方を使って、こういうのは、どういう場面で使われるものなのか、というのを具体的に知ってから、抽象的な話を理解するようにした方が、わかりやすいはずだからです。クロージャの利点を知らないまま、頭ごなしにクロージャ便利、とか、クロージャは圏論では…とか言われてもやっぱり追いつけないと思う訳です。
それで、状態を持った方が簡単に実装できそうなプログラムに対して、関数型プログラミング言語ではどうやって解決していくのかを理解するには、スタックやキューといったものをどう実装するのか、入出力を伴うプログラムはどうやって記述するのか、といったあたりをじっくりと考えてみるのが良いのでしょう。
最近、基礎文法からプログラミング言語を理解するというのが億劫になっていて、概論から理解を深めようとして、逆に時間がかかるみたいな感じもあったりします。細かい文法事項は、知ると「なるほど」とは思うのですが、実際に利用する場面にくるころには忘れてしまう、ということを繰り返しているので、そういうのはそういうときに調べればいいや、って最近はなっています。
まぁ、日々精進ということで。