関数型プログラミングの実用性だとか将来性だとか

に、ついて語ろうとすると、どうしても漠然とした話になってしまって、なかなか切り出せないのですが・・・

ちょっと今日、こんな記事を見つけまして。

【開発閑話】文系プログラマが関数型言語(とラムダ計算)を理解してみる【初心者向け解説】

「ご指摘やご感想等あればどうぞお寄せください。」という事ですし・・・ふふふ・・・大人げないなぁとか思いつつ、我慢できなかったのでちょっと記事を書かせて頂きますよん。

あのですね。
『心者向け』解説と題して、『中途半端な理解』(ならまだしも適当な理解)で関数型のネガティブな面を強調した記事を書くのは如何なものかと思うのですよ。
万が一でも、この記事を読んで閑数プログラミングの世界から足を遠ざける人が居たらイヤだなぁと。
その辺、いくらか配慮しては居るらしく、「研究材料としては興味深い」みたいな事仰ってるけど、ぶっちゃけフォローになってないです。

関数型言語の敷居を下げて、もっと普及させたいと思っている身としては、色々とモニョモニョしてしまう内容です。
かといって、細かい所を一個一個指摘していこうかと思うと、ちょっと突っ込みどころ多すぎて記事にしていると日がくれてしまうので、要点3つに纏めさせて頂きます。

要点その1、ラムダ式に関する間違い

…あれ、プログラミングできなくね?と思ったあなたは正解。

ラムダ式の機能そのものには、プログラミングに必要な基本的な機能がほとんどありません。

不正解です。

確かに手続き言語でラムダ式を扱う場合は「無名関数を定義するための構文の一つ」と捉えて問題無いかもしれませんが、ラムダ計算そのものはそれ自体がチューリング完全な計算モデルです。

つまり、純粋なラムダ計算でC言語と同等な表現力を持ちます。
理論上はこれだけでC言語コンパイラインタプリタを作ることもできる。と言うと解りやすいでしょうか。

もっとも、画面やキーボード等の入出力(IO)についてはちょっと特殊な話になって来て、濃ゆい関数型プログラマーの間でも認識が別れる部分なので、ここでは深く触れません。

要点その2、関数型プログラミングの設計は難しいのか

しかし詳細は後述しますが、関数型言語を利用すると、ほとんどの開発案件ではプログラム設計の難易度が飛躍的に上がり、開発効率が低下します。
これは開発工数の増大に直結するため、現実的な方法とは言えません。また現状の関数型言語においても、厳密にバグが無いことを証明することは容易ではありません。

「プログラム設計の難易度が飛躍的に上がる」事を説明した「詳細」がこの後の文章の何処にあるのかちょっと解りませんでしたが、関数型プログラミングにおいて「設計の難易度が飛躍的に上がる」と考えていらっしゃるなら、自分の考え方とは異なります。

自分は「設計の重要性は上がる」と考えていますが、「設計の難易度が上がる」とは思いません。
そもそも何を持って「設計の難易度が上がる」と考えているのか存じ上げませんが、もし「関数型言語は表現力が乏しいから」と考えているのなら、それは間違いです。

ある言語が「関数型言語」と呼ばれるためには、関数がファーストクラスオブジェクトである事が大前提なワケですが、この事は、それだけでその言語が「高度な抽象化」を可能にしていると言って良いほど重要なポイントです。
記事を読ませて頂いていると、どうも「map関数」を言語固有の機能のような解釈をされているようなのが気になりました。
map関数やfold関数のような、高階関数と呼ばれている関数は、あらゆる関数型言語を使って、簡単に再実装できます。
これらの関数自体が、その言語の持っている「表現力の賜物」だと思えば、少なくとも関数型言語が「複雑で柔軟なプログラムが表現できない」とは言えないでしょう*1

ついでに言うと、関数型プログラミングでは各関数を宣言的に記述するスタイルが基本なので、再利用性が高くリファクタリングが容易です。
つまり、メンテナンス性がめっちゃくちゃ高いです。・・・この点については、これ以上は言いますまい。

もっとも、仰っている「設計」というのが、我々SI屋の大大大大大好きな、役に立つのか立たないのかイマイチ良く解らない「設計書*2」とか言うものを書くことであるとするなら、それは確かに難しい事かもしれませんが・・・

要点その3、関数型言語はまだ実用段階に無いのか

このため現在のところ、関数型言語は実用的なプログラム言語としては受け入れにくい状況にあると言えます。まだ研究段階の思想といえるでしょう。

この辺は、半年ほど前に第一回関数型言語勉強会に参加した時点では足踏みしていたのですが、今なら断言しましょう。
関数型言語・・・という区分けは大雑把すぎるので、そうですね、純粋関数型プログラミング言語Haskellは十分実用に耐えうるプログラミング言語です。

ここ最近、Haskell×SDLの記事を何度か更新していましたが、理由は勿論(詳細はいくらか形になるまで公開しませんが・・・)、この言語を使ってわりと本格的な2Dゲームの開発に取り掛かっているからです。
最後の更新は9/9ですが、作業自体は徐々に進行していますし、その過程で「イケる!」という確信を掴んでたりとかします。

自分の場合はゲームでの事例ですが、Haskellを用いたWeb開発用フレームワークなんかもありますし、Scalaを業務に役立てている方もチラホラ居らっしゃるようです。
関数型言語は研究段階」という色眼鏡は、もうそろそろ、捨てても良いんじゃないですか?

おわりに

とまぁ、ちょっと熱くなってしまいましたが・・・
なんといいますか、そろそろHaskell歴1年超えた頃だし、何処かのタイミングで語りたいなぁとは思っていたので、上記のブログ主様には不本意かと思いますが、ちょっと足場にさせて頂きましたよん。

折角なので、関数型言語の世界に飛び込んで来て頂いて、あわよくばHaskell信者になってもらって一緒にホクホクしたいなぁとか、思ったり思わなかったり。

*1:むしろ手続き言語が聞き分けなくて堅苦しく感じます><。

*2:この手の話をすると必ず食いつく人が居るので念の為述べておきますが、システム開発にドキュメントが不要だなんて一言も言ってないし思ってないです。