「 じゃあ このつまらない四則演算を使って 例えてみよう☆」
「 枝になっているところに 演算子 があると思うが、これを消すことを Evaluation(エヴァーユエイション; 評価)と呼ぶ☆」
「 もう Evaluation できないところまで Evaluation し続けていけば最終的に 計算ドリルの答えのようなものが 1個 残るな☆
数学から見れば それは答えなのか……、なんだが☆ 慣れてくると それは 評価 と呼ぶようになる☆」
「 じゃあ全部 二分木 でやればいいだろ☆ ラムダ計算の出番は無い☆」
「 ラムダ計算が対象にしているのは 四則演算 ではなくて 関数 だぜ☆ 説明しよう☆」
「 計算の優先順序を表す丸かっこと、関数の引数を表す丸かっこが 同じ記号を使うのが混乱の元だと思うんだが、
もう このルールを変えずに、それでいて 混乱を無くす良い知恵がある☆」
「 引数をそのまま返す関数があるとしよう☆ 名前は仮に I としよう☆」
「 多変数関数 だってあるのよ! その気になれば 3分木 でも 4分木でも N分木が可能よ!」
「 複数の関数が 入れ子になって 1つの関数になっていると考えれば 二分木 にすることが可能☆
これを Curried(カリー化)と呼ぶ☆」
「 中学数学のノッテイション(Notation; 表記法)では いい書き方がないんだが……、気分的には 関数から 関数が返ってきている感じだぜ☆」
「 なんで 二分木 大好きなんだぜ☆? 意地っ張り わらう☆」
「 いろいろ 面白いので 寄り道して 1つ1つ見ていこう☆」
「 First-order function(一階関数)は こういう形をしているぜ☆」
「 四則演算は 扇の要(かなめ)に演算子があるのに対し!
関数は 左の肩に 名前、あるいは 働きの本体 があるのは 非対称じゃない?! 関数は 単項演算子と言えるのではないかしら!」
「 関数は Call(コール; 呼び出し) という演算子だぜ☆」
「 左肩と 右肩の両方が 関数のときは、評価すると 子も関数になる☆
この理屈は 見えるかだぜ☆?」
「 ナンバーが出てくることも ありそうな気がするけどなあ!」
「 右肩に ナンバー や ヴェリアボー が乗っていると 子は ナンバー、ヴェリアボー、ファンクション になるが☆、」
「 右肩に ファンクション が乗っていると、自動的に 左肩には ファンクション、その子もファンクションが
決まると思ってくれだぜ☆
また、関数コールは まだしていないぐらいの気分でいてくれだぜ☆」
「 関数コールとは、 右肩に ナンバーか ヴェリアボー が乗っているときのことを言う☆」
「 しかし 右肩に関数を乗せると 子どもは 関数になるのは、何が起こっているんだぜ☆?」
「 全貌として こういうパターンになるわけだが、
見えやすいように、左肩をヨコ系、右肩をタテ系にした図で 描き直してみよう☆」
「 関数というのは、 穴が空いている二分木 がそこに省略されてる、ぐらいに思ってほしい☆」
「 ラムダ計算では、 x に ナンバーの代わりに ファンクション を入れることもできるんだろ☆」
「 そうそう……、絵を描くのが めんどくさいんで 練習として、
x に f関数の自分自身 を入れてみるとしよう☆」
「 一見 うまいように くっついたように感じるが、これは無限ループする☆
x に 永遠に f を入れるので、 永遠に枝は伸び続け、計算に使えない☆」
「 f関数 と まったく同型の g関数 のx引数に、 f関数を入れた、ということにしましょう。
これなら 無限ループ しないわよ」
「 引数x は、複数個所 で 使われていても いいわけだぜ☆
じゃあ、 f関数と g関数 は同型として、 g(x)のxに fを入れてくれだぜ☆」
「 ラムダ計算の効能は その逆だな☆
みたくもないほど ぐちゃー っとした二分木を、見やすい二分木に変えてくれるわけだぜ☆」
「 (g(f))(x)
の x引数に ナンバーを入れたら、
4か所に ナンバーが入ることにならないか☆?」
「 このとき 別世界を見てみよう☆
f関数 を ずばっ と切ってしまって☆、
あるいは 非表示 にしてしまって☆、」
「 g関数は もともと ぐちゃっとした関数なんだ、と言い張ってもいいわけだぜ☆
g(x)
☆」
「 同じ部分を 何回も書く のは めんどくさいな☆ 関数を 関数に入れたいぜ☆」
「 関数を入れると 引数の穴1個 塞いじゃうの 納得いかないわよね」
「 二分木は もともと 引数が2つなんだ、ということに 着目してほしい☆」
「 左肩の方を増やす分には、引数が どんどん増えていくので、引数の穴は塞がないことに着目だぜ☆
これは カリー化(Curried) という☆」
「 なぜ 左肩と右肩で 違いがでてくるんだぜ☆?
左肩に乗せると 引数は増えていき、
右肩に乗せると 引数は1つのまま☆」
「 ノッテイション(Notation)と、演算子の優先順位(Order of operations) のせいだな☆
f(x)
のように 関数名を左側、引数を右側に書く習慣があるんだぜ☆
数学の教育を受けた人類は (x)f
と書かれたものは読みにくい☆
例えば (x)f(y)g(z)h
とか 読む順番が分からない☆」
「 無くてもいいんだが、有った方が便利なんで、左肩と右肩には 違いがあり、
だから偏りがあるわけだぜ☆」
「 左肩を伸ばしていくと、 複数個所 で関数呼び出しされて 増殖 するの?」
「 そんな使い方をすれば、そんな使い方ができる☆
重要なのは、二分木の図は、 正面から見て二分木 ということだぜ☆
思っているより分岐していることにまで、 頭を回せだぜ☆」
「 関数呼び出しする方は、中で 何回使われているか 知ることはできないし、知らなくていいからな☆」
「 しかし それでも、どこまでいっても、二分木に違いないことは お分かり頂けたと思う☆
葉の先に延長してるだけなんで☆
あるいは、別の言い方をすれば、どこでも 2つに分けれるんで☆ もちろん、計算順序に縛りはあるが……☆」
<書きかけ>
Crieitは個人で開発中です。
興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!