List Lambda演算中成对列表和递归列表之间的区别
我知道在lambda演算中有几种表示列表的方法。使用配对,我可以写一个列表 (t1,(t2,(t3,NIL))) 这相当于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
\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(列表长度)
很快,就准备好了作为递归的列表