« 変更管理の基盤は構成管理が支えている | トップページ | 金曜にバグを発生させるコミットが多い »

2009/04/26

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から関数型言語へ:

« 変更管理の基盤は構成管理が支えている | トップページ | 金曜にバグを発生させるコミットが多い »