据我所知,有几种方法可以在lambda演算中表示列表。使用对我可以写一个列表
(t1,(t2,(t3,NIL)))
相当于lambda术语\f. f t1 (\f. t2 (\f. t3 NIL)))
并执行
等操作head = \l.l (\h.\t.h)
作为递归的列表如何工作以及如何将它们写下来?
答案 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
- 列表产品,再次cons
和tail
{} list会给我们tail
附加在初始列表的后面。
Head op的实现方式就像whis:
head = \l. \def. l (\x. \y. x) def
如果list为空并返回头部,则需要返回一个列表和一个默认值。
尾部虽然难以实现,但它可以使用O(列表长度)。
很快,列表作为递归准备折叠。