λ- 미적분에서 모든 데이터 유형은 함수로 요약됩니다. λ- 미적분에는 노드 또는 포인터가 없으며 함수 만 있으면됩니다. 따라서 함수를 사용하여 모든 것을 구현해야합니다.
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
방법)과 동일합니다.
위의 부울의 교회 인코딩은 실제로 언어 구성으로 부울, 조건부 또는 루프가없고 순수하게 라이브러리 기능으로 구현하는 스몰 토크와 같은 OO 언어에서 조건부가 구현되는 방식입니다. 스칼라의 예 :
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