Javaから関数型言語へ
ジョエルのWikiはいつ読んでも面白い。
JavaよりもScheme、Haskellなどの関数型言語の習得が何故必要なのか、を説明している。
【元ネタ1】
Javaスクールの危険 - The Joel on Software Translation Project
(前略)
関数プログラミングを理解していなければ、GoogleをあれほどスケーラブルにしているアルゴリズムであるMapReduceは発明できない。
MapとReduceという用語はLispと関数プログラミングから来ている。
純関数プログラムは副作用がなく容易に並列化できるということを6.001に相当するプログラミングの授業で聞いて覚えている人には、MapReduceは容易に理解できる。
GoogleがMapReduceを発明し、Microsoftが発明しなかったという事実は、Microsoftが基本的な検索機能についてキャッチアップの途上にあり、一方Googleは次なる課題へと進んでいることを示している。
世界最大の並列スーパーコンピュータを構築しているのだ。
この流れの中でいかに遅れを取っているかをMicrosoftがちゃんと理解しているとは思わない。
(後略)
最近のプログラミング技術の傾向として、関数型言語の発想が必要になる場面が増えたように思う。
例えば、Googleの検索エンジンの背後にあるアルゴリズムMapReduceだけではない。
Amazonのレコメンドエンジンの背後にあるアルゴリズム協調フィルタリングも、同様だ。
WebもマルチコアCPUも、並列処理、分散処理のアイデアを使えば劇的に変わる可能性がある。
ジョエルのWikiには、関数型言語で再帰を使う問題が載っている。
【元ネタ2】
試してみよう - The Joel on Software Translation Project
1a. (MIT-Scheme) 次の関数
(define (accumulate combiner null-value l)
(if (null? l)
null-value
(combiner (car l)
(accumulate combiner
null-value
(cdr l)))))
を用い、リストの平方和を計算するsum-of-squaresを実装せよ。
例:(sum-of-squares '(1 2 3 4 5))
1b. (JavaScript) Schemeなんか知らないかもしれないね。次の問題は1aをJavaScriptにしたものだ。
次の関数
function accumulate(combiner, nullValue, l)
{
if (l.length == 0)
return nullValue;
var first = l.shift();
return combiner(first, accumulate(combiner, nullValue, l));
}
を用い、リストの平方和を求めるsumOfSquaresを実装せよ。
例:sumOfSquares([1,2,3,4,5])
Schemeは取っ付きにくいけれど、JavaScriptなら別だ。
関数脳のつくり方のように、リストを元ネタとして、リストに関数を適用する発想が必要だ。
| 固定リンク
「プログラミング」カテゴリの記事
- Javaのモジュールシステムの考え方をまとめてみた(2022.10.21)
- Javaのモジュールシステムは複雑性をより増している(2022.09.10)
- Javaはなぜ関数型言語になろうとしているのか(2022.09.02)
- Javaのラムダ式の考え方(2022.08.10)
- Javaはオブジェクト指向言語ではなく関数型言語だった~「[増補改訂]関数プログラミング実践入門」はお勧めの本だ(2022.08.06)
コメント