関数型言語って何がすごいんですか
C使いの人に、
関数型言語って何がすごいんですか
と聞かれて、
じゃあC言語で accumulator すなわち、数nをとり、「数iを取ってnをiだけ増加させ、その増加した値を返す関数」を返すような関数を書いてみろよ
って言ったら、
値を返す関数を返すような関数・・・? オンドゥルルラギッタンディスカー
で、会話が続かない。
さらに、C使いのターン。
関数に関数を渡せる? Cだって関数ポインタ渡せますよ。
チューリング完全なんだから、どんなプログラムだって書けますよ。
と仕掛けてきた。そこで、
じゃあ、3回呼ぶと動作が変わる関数を書いてみて。
f();
f();
f();
f();
と呼ぶと、
3
2
1
liftoff
って出力されるやつ。ロケットみたいな。
できました。
#include <stdio.h> void f() { static int count = 3; if (count) { printf("%d\n",count); count--; } else printf("liftoff\n"); } int main(void) { f(); f(); f(); f(); return 0; }
OK. じゃあさ・・・。実はロケットは2機あったんだよ。ロケットg。カウントダウン別々で。
f();
f();
f();
f();
g();
g();
と呼ぶと、
3
2
1
liftoff
3
2
ってなるようにしてくれ。
と問題をだしたら、白旗をあげて、
安西先生・・・関数をコピーしたいです・・・
となった。関数がファーストクラスなのが関数型言語の特徴さ。
おっと、関数型言語に触れてしまったか。甘い痺れがいつまでもとれないだろう?
javascript ならこうなります。
function rocket(n) { return function () { if (n) { console.log(n); n--; } else console.log('liftoff'); } } var f = rocket(3); var g = rocket(3); f(); f(); f(); f(); g(); g();