Lists作为对和Lists之间的差异作为Lambda微积分中的递归

时间:2014-04-28 19:31:15

标签: list lambda-calculus

据我所知,有几种方法可以在lambda演算中表示列表。使用对我可以写一个列表

(t1,(t2,(t3,NIL)))

相当于lambda术语\f. f t1 (\f. t2 (\f. t3 NIL)))

并执行

等操作
head = \l.l (\h.\t.h)

作为递归的列表如何工作以及如何将它们写下来?

1 个答案:

答案 0 :(得分:0)

列表作为递归是"自然折叠"。

ctors看起来像这样:

nil  =               \add. \zero. zero
cons = \head. \tail. \add. \zero. add head (tail add zero)

经过一些优化(内联体,beta / eta-减少一切),术语

cons(1, cons(2, cons(3, nil)))

成为等效的

\add. \zero. add 1 (add 2 (add 3 zero))

正如您所注意到的,该列表等待两个ctor替换器(cons - > add,nil - >零),并成为折叠。

应用(+)0会为我们提供列表总和,(*)1 - 列表产品,再次constail {} list会给我们tail附加在初始列表的后面。

Head op的实现方式就像whis:

head = \l. \def. l (\x. \y. x) def

如果list为空并返回头部,则需要返回一个列表和一个默认值。

尾部虽然难以实现,但它可以使用O(列表长度)。

很快,列表作为递归准备折叠。