List Lambda演算中成对列表和递归列表之间的区别

List Lambda演算中成对列表和递归列表之间的区别,list,lambda-calculus,List,Lambda Calculus,我知道在lambda演算中有几种表示列表的方法。使用配对,我可以写一个列表 (t1,(t2,(t3,NIL))) 这相当于lambda术语\f。f1(\f2.t2(\f2.t3无)) 并执行以下操作: head = \l.l (\h.\t.h) 列表作为递归器是如何工作的?我将如何写下它们?列表作为递归器是“自然折叠” 这些系数如下所示: nil = \add. \zero. zero cons = \head. \tail. \add. \zero. add h

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

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

这相当于lambda术语
\f。f1(\f2.t2(\f2.t3无))

并执行以下操作:

head = \l.l (\h.\t.h)
列表作为递归器是如何工作的?我将如何写下它们?

列表作为递归器是“自然折叠”

这些系数如下所示:

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->zero),并成为一个折叠

再次应用
(+)
0
将为我们提供列表总和,
(*)
1
-列表乘积,
cons
,一些
尾部
列表将为我们提供附加到初始列表后面的
尾部

Head op的实施方式与whis类似:

head = \l. \def. l (\x. \y. x) def
如果list为空并返回head,则返回一个list和一个默认值

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

很快,就准备好了作为递归的列表