これは反例です:λ計算では、すべてのデータ型は関数に要約されます。λ計算にはノードやポインターはありません。唯一の機能は関数です。したがって、関数を使用してすべてを実装する必要があります。
これは、ECMAScriptで記述された、ブール値を関数としてエンコードする例です。
const T = (thn, _ ) => thn,
F = (_ , els) => els,
or = (a , b ) => a(a, b),
and = (a , b ) => a(b, a),
not = a => a(F, T),
xor = (a , b ) => a(not(b), b),
iff = (cnd, thn, els) => cnd(thn, els)();
そして、これは短所リストです:
const cons = (hd, tl) => which => which(hd, tl),
first = list => list(T),
rest = list => list(F);
自然数は、反復関数として実装できます。
セットは、その特性関数(contains
メソッド)と同じものです。
上記のブールのチャーチエンコーディングは、実際には、Smalltalkなどのオブジェクト指向言語で条件が実装される方法であることに注意してください。Scalaの例:
sealed abstract trait Boolean {
def apply[T, U <: T, V <: T](thn: => U)(els: => V): T
def ∧(other: => Boolean): Boolean
def ∨(other: => Boolean): Boolean
val ¬ : Boolean
final val unary_! = ¬
final def &(other: => Boolean) = ∧(other)
final def |(other: => Boolean) = ∨(other)
}
case object True extends Boolean {
override def apply[T, U <: T, V <: T](thn: => U)(els: => V): U = thn
override def ∧(other: => Boolean) = other
override def ∨(other: => Boolean): this.type = this
override final val ¬ = False
}
case object False extends Boolean {
override def apply[T, U <: T, V <: T](thn: => U)(els: => V): V = els
override def ∧(other: => Boolean): this.type = this
override def ∨(other: => Boolean) = other
override final val ¬ = True
}
object BooleanExtension {
import scala.language.implicitConversions
implicit def boolean2Boolean(b: => scala.Boolean) = if (b) True else False
}
import BooleanExtension._
(2 < 3) { println("2 is less than 3") } { println("2 is greater than 3") }
// 2 is less than 3