Kei*_*son 5 compiler-construction interpreter functional-programming lambda-calculus untyped-variables
是否有无类型lambda演算的解释器(或编译器)?(根据这个帖子,它是可能的.)我认识到它作为一种编程语言几乎没有用处,特别是如果大部分语言(例如数字和布尔运算符)是由用户或库实现的.语言本身.但是,我仍然认为这对学习和探索微积分很有用.对于这个,解释器比编译器更可取,因为它们可以工作.有谁知道这样的节目?
您可以使用任何具有lambda抽象的无类型语言.例如Python或JavaScript.主要有两个缺点:
知道了这一点,让我们在Python中做一个例子:首先我们创建辅助函数来在数字和教会数字之间进行转换:
# Construct Church numeral from an integer
def int2church(n):
def repeat(f, m, x):
if (m == 0): return x
else: return f(repeat(f, m-1, x))
return lambda f: (lambda x: repeat(f, n, x))
def church2int(l):
return l(lambda x: x + 1)(0)
Run Code Online (Sandbox Code Playgroud)
现在我们可以在数字上定义标准操作:
zero = int2church(0)
one = int2church(1)
pred = lambda n: lambda f: lambda x: n(lambda g: lambda h: h(g(f)))(lambda u: x)(lambda u: u)
mul = lambda m: lambda n: (lambda f: m(n(f)))
expn = lambda n: lambda m: m(n)
tetra = lambda n: lambda m: m(expn(n))(one)
Run Code Online (Sandbox Code Playgroud)
并计算例如4 3:
expn = lambda n: (lambda m: m(n))
a = int2church(4)
b = int2church(3)
print church2int(expn(a)(b))
Run Code Online (Sandbox Code Playgroud)
a = int2church(5)
b = int2church(2)
print church2int(tetra(a)(b))
Run Code Online (Sandbox Code Playgroud)
为了能够表达更有趣的东西,我们可以定义Y组合子:
y = lambda f: (lambda x: f(lambda v: x(x)(v))) (lambda x: f(lambda v: x(x)(v)))
Run Code Online (Sandbox Code Playgroud)
并计算例如阶乘:
true = lambda x: (lambda y: x)
false = lambda x: (lambda y: y)
iszero = lambda n: n(lambda x: false)(true)
fact = y(lambda r: lambda n: iszero(n)(one)(mul(n)(lambda x: r(pred(n))(x))))
print church2int(fact(int2church(6)))
Run Code Online (Sandbox Code Playgroud)
注意,Y组合器必须适合于使用η-展开进行严格评估,以及因为严格评估而避免无限递归的阶乘函数.
| 归档时间: |
|
| 查看次数: |
2483 次 |
| 最近记录: |