ブール値を関数で定義する(ラムダ計算)

以下、 型システム入門 −プログラミング言語と型の理論− の 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)

こんな調子で

こんな調子で、ブール値だけでなく自然数も定義できるし、自然数の加法も乗法も定義できる。ラムダ計算の理解が深まる。