関数だけで四則演算をやってみた (後編)
前回の続き
乗法演算
さて、掛け算はMultiply関数を使います。
var Multiply = function (m) { return function (n) { return function (f) { return m( n(f) ); }; }; };
二つの数値の積を求めるには、次のようにすればいいです。
ToNumber(Multiply(_0)(_1)); //0 ToNumber(Multiply(_2)(_1)); //2 ToNumber(Multiply(_2)(_2)); //4
かなり楽にできました。となると、割り算はどうすればいいのでしょうか。
数値を比較するLessEqual関数とLess関数
割り算を説明する前に、LessEqual関数と、Less関数を作って、数値を比較できるようにしておきます。ちなみに、LessEqual関数は、小なりイコール (不等号は <= )、Less関数は小なり (不等号は < )を意味します。
/*<= (less than or equal to)*/ var LessEqual = function (m) { return function (n) { return IsZero ( Minus(m)(n) ); }; }; LessEqual(_0)(_1); //True LessEqual(_1)(_1); //True LessEqual(_1)(_0); //False /*< (less tahn)*/ var Less = function (a) { return function (b) { return Not( LessEqual(b)(a) ); }; }; Less(_0)(_1); //True Less(_1)(_1); //False Less(_1)(_0); //False
除法演算
割り算は、プログラムで、小数を出しましたが、今回は小数を扱わず、答えとなる商と余りを出すことだけにします。
商を求めるために、Divide関数を作ります。前々回で作っておいたPair関数とRepeat関数とSelect関数の三つも使います。
var Division = Repeat ( function (it) { return function (q) { return function (a) { return function (b) { return Select( Less(a)(b) )( function (x) { return Pair(q)(a); } ) ( function (x) { return it ( Successor (q) ) ( Minus (a)(b) ) ( b ); } ); }; }; }; } ) ( _0 );
できましたら、このDivide関数を使って、商を求めるためのDiv関数と、余りを求めるためのMod関数の二つを作ります。
var Div = function (a) { return function (b) { return First ( Division(a)(b) ); }; }, Mod = function (a) { return function (b) { return Second ( Division(a)(b) ); }; };
さて、この二つの関数を使って、割り算をやってみましょう。
var _4 = Multiply(_2)(_2), _5 = Successor(_4), _6 = Successor(_5), _7 = Successor(_6), _25 = Multiply(_5)(_5); ToNumber(Div(_4)(_2)); //商2 ToNumber(Div(_25)(_5)); //5 ToNumber(Div(_7)(_4)); //1 ToNumber(Mod(_4)(_2)); //余りは0 ToNumber(Mod(_5)(_4)); //1 ToNumber(Mod(_7)(_4)); //3
おまけ (べき演算)
2の2乗は4で、3乗は8となりますが、これも関数だけできます。以下に例を挙げておきます。
var Exponent = function (a) { return function (b) { return b(a); }; }; ToNumber(Exponent(_2)(_1)); //2 ToNumber(Exponent(_2)(_2)); //4 ToNumber(Exponent(_4)(_4)); //256 = 4^4 (4の4乗)
あとがき
今回は四則演算までやりました。数値も基本的な計算も、関数だけでできることを示すことができました。
http://jwodder.freeshell.org/lambda.htmlのメモで残っているのは、数値の比較と、リストの処理関数です。これはまた、別の機会に。