2014/01/29
関数型料理
関数型プログラミングを料理の仕方でたとえてください。
作る料理はなんでも構いません。
料理の一般的なレシピというのは、手続き型プログラミングで
たとえることが可能だと思っています。
「料理の仕方」と言ってしまった時点で手続き型思考の罠にはまってる気がする。
関数型の雰囲気だと、それは「料理の定義」に近いものになりそう。
- ペペロンチーノとは、「炒めたにんにくと唐辛子」と「茹でたパスタ」を混ぜたものである
- 「炒めたにんにくと唐辛子」は、「薄切りにんにく」と「輪切り赤唐辛子」をオリーブオイルで弱火にてxx分間炒めたものである
- 「茹でたパスタ」は乾燥パスタを湯に入れxx分経過したものである
- ...
っていう具合。
「手順」は陽に示されてないけど、そこは処理系がうまいことこの定義に従うように よろしくやってくれる。
パスタを茹でることでパスタの状態を変化させる、とは考えない。乾燥パスタを「茹でる」 操作の入力に与えると、出力に「茹でたパスタ」が得られる、と考える。 元のパスタは無くなるんだから変化してるじゃないかって? いやここでは時間もパラメータであって、時刻T1にスタートしてT2に茹で上がったとすると、 「T1に乾燥パスタがある」という状態はパスタが茹で上がった後でも不変だ。 現実世界ではタイムマシンがないからその状態にもうアクセスできないってだけで。
レシピが手順書の形を取っているのは、 人間がやる場合はいちいち頭の中で手順を考えるより、「コンパイル結果」である手順書を 逐次フォローしていった方が楽だからだろう。
ただ、単一の料理でなく一回の食事の準備という観点では、人は 「今日の夕食は、ご飯と肉じゃがとおひたしと昨日の残りの…」などど 定義を考えてからon-the-flyでコンパイルしつつ並列処理で仕上げるので、 その点については実は関数型言語の動作に近いかも。
Tag: Programing
Post a comment