JavaScript
再帰
関数型プログラミング
純粋関数型言語

※続編も書いたで!

Haskellをかけない中年

純粋関数型言語と参照透過性

ワイのElmデビュー


とあるブラックなWeb制作会社にて

ワンマン社長「やめ太郎くん」

ワイ「はい」

ワンマン社長「明日からインターンの子が来るから、プログラミングを教えたってや」

ワイ「ええで」

ワンマン社長「まだ中学生やから、優しくしたってな?」

ワイ「お、おう」

ワイ「(ファッ!?)」

ワイ「(ちゅ、中学生て)」

ワイ「(うちの会社はどんだけ人材に困ってんねん・・・)」

ワイ「(青田買いにもほどがあるで・・・)」

ワイ「(ていうか入社は何年後やねん)」


翌日

少女「よろしくお願いします」

ワイ「おう、よろしくやで」

ワイ「(なんや、変わったTシャツ着とるな)」

ワイ「(ハスケルカケル、て書いてあるで)」

ワイ「(そんなん、絶対Haskell書ける子やん)」

ワイ「(ちょっとヤバい子なんかな・・・)」

ワイ「きみ、名前はなんていうん?」

少女「蓮 蹴子(はす・けるこ)です」

ワイ「(出たで)」

ワイ「(蹴る子どもけるこて)」

ワイ「(親は何を願って名づけてんねん)」

ワイ「え、ええ名前やな・・・」

少女「ありがとうございます」

少女「友達からはハスケル子って呼ばれてます」

ワイ「(ただのフルネームやないかい)」


さっそく教えてみる

ワイ「ほな、今日はJavaScriptの勉強をしていくで〜」

ワイ「きみ、JavaScriptは書いたことあるん?」

ハスケル子「Javaは書いたことないです」

ハスケル子「ごめんなさい」

ワイ「ええでええで〜」

ワイ「(まじか)」

ワイ「ええねんけど、JavaJavaScriptは全く別の言語やで」

ワイ「メロンパンメロンパンナちゃんくらい違うんや」

ハスケル子「どっちがメロンパンナちゃんですか

ワイ「・・・それは・・・JavaScriptや(震え声)」

ワイ「(理由を聞かれる前に次の話題や・・・)」

ワイ「ほんで、プログラミング言語は何か勉強したことあるん?」

ハスケル子「Haskellを」

ワイ「(せやろな)」

ワイ「(これでPHPだけです〜言われたらずっこけるわ)」

ワイ「おお〜、中学生にしてプログラミング経験者とは心強いで」

ワイ「ほなJavaScriptも余裕かもな〜」


作ってみたいものを聞いてみる

ワイ「ほな、何かJavaScriptで作ってみたいものとかある?」

ハスケル子「じゃあ・・・」

ハスケル子「初めてなので、まずは」

ハスケル子「フィボナッチ数列を表示するプログラムでも作ってみたいです」

ワイ「あー、ええな〜」

ワイ「その前にちょっとトイレ行ってくるわ


in トイレ

ワイ「なんやフィナぼっち数列て」

ワイ「Google先生に質問や・・・検索、と」

Google先生「もしかして:フィボナッチ数列

ワイ「おお、フィナぼっちやなくてフィボナッチか」

ワイ「学生時代ずっとぼっちやったから、それに引っぱられてもうたわ」

ワイ「なになに」

ワイ「0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610・・・っていう数列か」

ワイ「どういう規則性や」

ワイ「ふむふむ」

ワイ「0番目の数字1番目の数字を足したものが2番目の数字になって」

ワイ「1番目の数字2番目の数字を足したものが3番目の数字になって」

ワイ「2番目の数字3番目の数字を足したものが4番目の数字になって・・・」

ワイ「ああ、なんか見たことあるわ」

ワイ「これがフィナぼっち、いやフィボナッチ数列いうやつなんか」


研修開始

ワイ「お待たせやで〜」

ワイ「よーし、ほなまずはワイがJavaScriptのお手本を見せていくで〜」


yametaro.js

const fibo = n => {

// ここに処理内容を書く。
};

fibo(10);


ワイ「こんな感じで、fibo(10)って実行したら10番目のフィボナッチ数が返ってくるような関数を作っていくで〜」

ハスケル子「はい」

ワイ「nってのは引数や」

ワイ「fibo(10)って実行したなら、nには10が入ってくんねや」

ワイ「ほな、関数fiboの中身を書いていくで

ワイ「まず、フィボナッチ数列の0番目の数は0

ワイ「あと、1番目の数は1

ワイ「ってことは決まっとるから」

ワイ「ここはベタ書きや」


yametaro.js

  const arr = [0, 1];


ワイ「こんな感じでフィボナッチ数列を配列にしていってみるで」

ワイ「ほんで、2番目以降のフィボナッチ数は」

ワイ「その前の数字前の前の数字足したものを入れてかなあかん、と」

ワイ「ほな、2からnまでfor文で繰り返しながら、どんどん継ぎ足し継ぎ足しでフィボナッチ数列を作っていけばええわけやから・・・」


yametaro.js

  // 2からnまでfor文で繰り返す。

for (let i = 2; i <= n; i++) {
// 配列に継ぎ足すのは、
// 1つ前の数値と2つ前の数値を足したもの。
arr.push(arr[i - 1] + arr[i - 2]);
}

ワイ「こうやな」

ワイ「ほんで最後に、配列のn番目の要素returnすればええねや」


yametaro.js

  return arr[n];


ワイ「できたで」


yametaro.js

const fibo = n => {

const arr = [0, 1];

// 2からnまでfor文で繰り返す。
for (let i = 2; i <= n; i++) {
// 配列に継ぎ足すのは、
// 1つ前の数値と2つ前の数値を足したもの。
arr.push(arr[i - 1] + arr[i - 2]);
}

return arr[n];
};



どや?

ワイ「な、簡単やろ?」

ハスケル子「全然わかりません

ワイ「!?

ワイ「え・・・何で・・・」

ハスケル子「Haskellにはfor文ないので・・・・」

ワイ「(まじか)」

ワイ「あー、せやったなー」

ワイ「(知らんけど)」

ハスケル子「あとHaskellでは配列1もイミュータブル(不変)なので、」

ハスケル子「同じ配列にどんどん要素を足していく、みたいのもできないので」

ワイ「あー、せやったなー」

ワイ「(ぐぬぬぬぬ)」

ハスケル子「むしろ、私ならこうするなーってのはあります」

ワイ「お、おう」

ワイ「(もう先輩にダメ出しかいな)」

ワイ「(しまいにゃしばくど)」

ワイ「ど、どんな感じか教えてや♪」

ハスケル子「はい」


keruko.js

const fibo = n => (n === 0 || n === 1)? n: fibo(n - 1) + fibo(n - 2);


ハスケル子「こんな感じです」

ワイ「なるほど、こう来はりましたか〜」

ワイ「(なんやこれ)」

ワイ「(たったの1行やん・・・!!!)」


keruko.js

(n === 0 || n === 1)? n


ハスケル子「この部分は」

ハスケル子「n0か1ならnをそのまま返すってことです」

ワイ「せやな」

ハスケル子「nが2以上の場合は・・・」


keruko.js

fibo(n - 1) + fibo(n - 2)


ハスケル子「こっちを返します」

ハスケル子「つまり・・・」

ハスケル子「数学の神に問うんです

ワイ「せやな

ワイ「(分かってへんことがバレんようにここは同意や・・・)」

ワイ「神に問うんや!

ハスケル子「たとえば、10番目のフィボナッチ数は何ですか?って神に問うんです

ハスケル子「そうすると」


汝、10番目のフィボナッチ数を求めるか・・・

ならば、9番目と8番目のフィボナッチ数を足すがよい・・・


ハスケル子「って神がお答えになるんです

ハスケル子「だから次はこう問うんです

ハスケル子「その9番目と8番目のフィボナッチ数は何と何ですか?って」

ハスケル子「そうすると」


汝、9番目と8番目のフィボナッチ数を求めるか・・・

9番目のフィボナッチ数は、8番目と7番目のフィボナッチ数を足すがよい・・・

また、8番目のフィボナッチ数は、7番目と6番目のフィボナッチ数を足すがよい・・・


ハスケル子「って神はお答えになるんです

ハスケル子「フィボナッチ数ってそういうものなんです

ハスケル子「それをそのままコードに書けば良いんです

ハスケル子「つまり、n番目のフィボナッチ数を求めるなら、」

ハスケル子「n-1番目のフィボナッチ数と、n-2番目のフィボナッチ数を足せば良いんです」

ハスケル子「だからこうです


keruko.js

fibo(n - 1) + fibo(n - 2)


ハスケル子「あるフィボナッチ数を求めるために、別のフィボナッチ数を求めるんです

ハスケル子「関数fiboの中で関数fiboを使うことで、関数fiboは完成するんです」

ワイ「そ、そんなことしたら無限ループになるかもしれんやん?」

ハスケル子「なりません

ハスケル子「最終的には関数fibo自身を使わずに0や1を返す部分にたどり着くことになるので」

ハスケル子「そこでちゃんと終わります」

ワイ「(ぐぬぬぬぬぬ・・・!!!)」

ワイ「ご、合格や!!!

ワンマン社長「(何が合格や・・・)」

ワンマン社長「(苦しすぎるで・・・)」

ワイ「(アカン、関数fiboゲシュタルト崩壊で頭がパニックや)」

ワイ「初日やから、この辺で終わりでええで〜」

ワンマン社長「(あ、逃げた・・・)」


こんな子どこで見つけたんや

ワイ「蓮 蹴子さんハンパないなぁ・・・」

ワイ「for文iをインクリメントしながら数列を継ぎ足して作っていくんやなくて、定義をそのままコードとして書くんやな・・・」

ワイ「カッコ良すぎるわ・・・」

ワイ「問題の本質を見抜き、初めて触る言語でサクッと実装する・・・」

ワイ「なんて中学生や・・・」

ワイ「社長・・・こんな逸材どこで!?

ワンマン社長「(人差し指を立てて)ツイッタ〜!

ワイ「ビズリーチちゃうんかい!!!」

〜Fin〜


追記

続編もよろしくやで!





  1. 正しくはリストですね。