関数だけで四則演算をやってみた (後編)

前回の続き

乗法演算

さて、掛け算は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のメモで残っているのは、数値の比較と、リストの処理関数です。これはまた、別の機会に。