数の定義
以下を num.lhs としてhugsで実行
xを0を設定する操作、fを1を数える操作だとすると、1から5は以下のようにに定義される >zero f x = x >one f x = f x >two f x = f(f x) >three f x = f(f(f x)) >four f x = f(f(f(f x))) >five f x = f(f(f(f(f x)))) ここで、xを適用するための関数base、fを適用するための関数を以下のように定義すると >base = 0 >count = (+1) zero count base => 0 one count base => 1 two count base =>2 となり数を表す関数が正しいことがわかる ここでnumを以下のように定義すると >num x = x count base num one => 1 のように利用することができる 次にzero乃至fiveを演算する関数を定義する。 one count base => {f x}{(+1),0}のβ変換 => (+1) 0 => 1 two count base => {f(f x)}{(+1),0}のβ変換 =>(+1)((+1) 0) => 2 だから、操作plusは plus one two count base => (+1)((+1)((+1) 0))) =>3 と変換される関数となるので plus one two count base => one count (two count base) したがって以下の用に定義される >plus a b f x = a f (b f x) 実行は plus one two count num num (plus one two) num $ plus one two のいずれかでよい($は括弧の代替で右から評価と覚えるとよい) 同様に、操作timesは times three two count base かけ算の定義によるとtwoつまり((+1)((+1) 0))をthree 3回数えるのと同じである ところが、threeの定義は three = f(f(f x)) と、「ベースに対し操作を3回繰り返す」という定義なので times three two count base => three two count base となり何も変換せずに引数をそのまま出力すればよい (times three two) count base => (three two) count base とすると変換規則は括弧の中だけでよいのでtimesは以下のようになる >times a b = a b 同様にexpは以下のように定義される(めんどくさくなった。) >exp a b = b a
感想としてはCPU内部で実装されている演算もビットのオンオフつまり操作なので関数型の演算でマシンが作れることを意味している。
リストプロセッサなり第五世代コンピュータを作っていればプログラムの進化はもっと速かったのかもしれない。
まあ、括弧の無いλ演算が一般人に使えるインターフェイスとして提供されてきたのはここ10年であるし、使いものになるスピードになったのもここ10年であることは感慨深い。オブジェクトだけで組まれたOSつまりsmalltalkがあるように、関数だけで組まれたOSも出てくるのかもしれない。逆にlispによるOSが存在していたのでもうでないかもしれない。
関数型言語のみでブラウザやオフィス製品が実装できればいけるのかもしれないが、関数型言語で考えるとブラウザとオフィスは余りにも冗長すぎて関数型を使う意味を失う。
関数型言語が花開くのは、意味的に閉じている世界、つまりサーバサイドであろう。
データフローマシン内のアーキティクチャとしても向いている。
小型のwiki,blog等のエンジンとしては画期的なのではないだろうか?
関数型は拡張に対して柔軟で、オブジェクト型は最初から作るのに柔軟であるから。
ところが、関数型は数学に対する基礎知識を必要とするためVBのような日曜大工プログラマが出てくる可能性が低い。
構造化プログラム、オブジェクト指向プログラム等のようにブームが来たときに花開くのであろう。そのためにはキラーアプリケーションの存在が必須となる。
ドミノの一枚めになれるかわからないがまずは作ってみるか。
極地は、誰もいないから極地であって、誰かがいればそれは既に極地ではなく、わたしの興味を失うから。
因果な性格だ。
金型に代表される量産性もまた極地の一つなのがまた面白い、というかそこもまたわたしの興味の対象である。人間は群れてこそ意味のある動物なのだから。