人気ブログランキング | 話題のタグを見る

短いスクリプトを書くには

Haskell を使ってみて一番嬉しかったのは、プログラムの短さだ。たとえば、フィボナッチ数列の10個を作るのに、要するプログラムは、次のようになる。

Hugs> take 10 fib where fib = 1:1:zipWith (+) fib (tail fib)
[1,1,2,3,5,8,13,21,34,55]

なんで、プログラムが短いほうがいいかというと、タイポが入り込む確率が少ないことだ。したがって、バグ取りが激減する。バグは、論理の誤りからくるものよりも圧倒的にタイポからくるものが多い。したがって、タイポが減ればバグも激減する。

JavaScriptでも同じことが言える。同じことを短いプログラムで書ければ、バグは激減する。たとえば、次の二つのリストを連想配列に登録することを考えてみよう。

["apple", "lemon", "grape", "melon", "orange"]
["red", "yellow", "purple", "green", "orange"]

これを以前のエントリーで定義した zipWith 関数を用いると次のようになる。

a = []; zipWith(function(x,y){a[x]=y}, ["apple", "lemon", "grape", "melon", "orange"]
, ["red", "yellow", "purple", "green", "orange"])

a["apple"]
"red"

このプログラムは Haskell on JavaScript のページで動作確認できる。直接にa["apple"]="red";... と記述するのは言わずもがな、for ループを使った次のプログラムも、; 忘れや i の前の var を忘れたことによる副作用などの危険がある。

a = [];
b = ["apple", "lemon", "grape", "melon", "orange"];
c = ["red", "yellow", "purple", "green", "orange"];
for (var i = 0, i < b.length; i++) {
  a[b[i]] = c[i];
};

要するに、短い表現でプログラムを作るためには、汎用性の高い関数の手持ちがあればいいのだ。それに、短いプログラムは直感的にその内容が分かるという可読性の利点もある。

Haskell の関数を JavaScript に導入することが短いプログラム作成の助けになるかどうかは分からないが、次のようなプログラムを見ると、Haskell の発想を JavaScript に導入することは意味のあることではないかという気がする。

map(function(x){return x * x }, seq(1,10))
[1,4,9,16,25,36,49,64,81,100]
by tnomura9 | 2010-12-17 20:16 | JavaScript | Comments(0)
<< 無名連想配列の作り方 JavaScript で末尾再帰 >>