教会对自然数字的数字编码是否不必要地复杂化?

Pet*_*son 4 language-agnostic lambda-calculus sicp church-encoding

我一直在阅读的计算机程序书的结构和解释通过定义零和增量函数来呈现教会数字

zero: ?f. ?x. x
increment: ?f. ?x. f ((n f) x)
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎相当复杂,我花了很长时间才弄清楚它并派生出一个(?f.?x. f x)和两个(?f.?x. f (f x)).

以这种方式编码数字会不会更简单,零是空的lambda?

zero: ?
increment: ?f. ?. f
Run Code Online (Sandbox Code Playgroud)

现在,派生一个(?. ?)和两个(?. ?. ?)等等是微不足道的.

这似乎是用lambda表示数字的更直接明显和直观的方式.这种方法是否存在一些问题,因此教会数字的工作原理是一个很好的理由?这种方法已经证实了吗?

nam*_*min 8

你的编码(零:?x.x,one:?x.?x.x,two:?x.?x.?x.x等)可以很容易地定义增量和减量,但除此之外,为你的编码开发组合器变得相当棘手.例如,您将如何定义isZero

思考教会编码的直观方式是数字n由迭代n次数的动作表示.这样就可以很容易地开发组合器,就像plus只使用编号中的迭代一样.不需要花式组合器进行递归.

在Church编码中,每个数字都有相同的接口:它有两个参数.在编码中,每个数字都由它所采用的参数数量来定义,这使得统一操作非常棘手.

编码数字的另一种方法是将数字视为n = 0 | S n,并使用香草编码进行联合.