【发布时间】:2017-09-12 22:44:46
【问题描述】:
我正在尝试在 lambda 演算中创建用于计算列表元素总和和列表长度的函数。
列表示例:a := [1, 2, 3] = λcn.c 1 (c 2 (c 3 n))sum a 应返回 6,len a 应返回 3。
我写了递归版本:
len = λl.if (empty l) 0 (plus 1 (len (tail l)))
sum = λl.if (empty l) 0 (plus (head l) (sum (tail l)))
if、empty、plus、tail 是其他 lamda 函数。
然后我用定点组合器做了一些技巧:
len = λl.if (empty l) 0 (plus 1 (len (tail l)))
len = λfl.if (empty l) 0 (plus 1 (f (tail l))) len
len = Y λfl.if (empty l) 0 (plus 1 (f (tail l)))
在哪里Y = λf.(λx.f(x x))(λx.f(x x))
sum 也一样。所以现在我有非递归版本。但我无法在这里使用 beta 缩减获得 beta 范式。
我想知道这些函数是否存在 beta 范式以及它们的样子。
【问题讨论】:
-
那么当你说
1、2、3等时,是指那些代表教会数字的λf.λx.f x、λf.λx.f (f x)、λf.λx.f (f (f x))等吗? -
@naomik 是的,完全正确
-
gallais 为您提供完美答案
标签: functional-programming lambda-calculus