ブール値を関数で定義する(ラムダ計算)
以下、 型システム入門 −プログラミング言語と型の理論− の P.44-45 を参考にした。
ラムダ計算を使って、ブール値を関数で実装する。言語は、Node.js (バージョン 6 以上)。関数型プログラミングに興味あるなら Haskell とか使えよって感じですが、許してください。
ブール値を関数で定義する
true, false を以下のように定義する。これらは関数を返す関数である。
const tru = t => f => t const fls = t => f => f
if 文を関数で定義する
if文 if b then v else w
も関数である。
const ifThen = bool => v => w => bool(v)(w)
使い方は次の通り。
const assert = require('assert') // わかりやすくするため、値を持つ変数を定義する let v1 = 'value1' let v2 = 'value2' let expectV1 = ifThen(tru)(v1)(v2) assert.equal(expectV1, v1) let expectV2 = ifThen(fls)(v1)(v2) assert.equal(expectV2, v2)
ブール演算子も関数で定義する
and 演算子。
const and = b => c => b(c)(fls)
assert.equal(and(tru)(tru), tru)
assert.equal(and(tru)(fls), fls)
assert.equal(and(fls)(tru), fls)
assert.equal(and(fls)(fls), fls)
or 演算子。
const or = b => c => b(tru)(c)
assert.equal(or(tru)(tru), tru)
assert.equal(or(tru)(fls), tru)
assert.equal(or(fls)(tru), tru)
assert.equal(or(fls)(fls), fls)
not 演算子
const not = bool => ifThen(bool)(fls)(tru)
assert.equal(not(tru), fls)
assert.equal(not(fls), tru)