我最近偶然发现了这篇文章,它描述了如何在 Ruby 中只使用 Procs 来编写 FizzBuzz,由于我很无聊,我认为尝试在 Python 中使用 lambdas 实现同样的东西会很好。
我到了使用嵌套函数创建数字的部分,并编写了以下 Python 脚本:
#!/usr/bin/env python
zero = lambda p : (lambda x: x)
one = lambda p : (lambda x: p(x))
two = lambda p : (lambda x: p(p(x)))
three = lambda p : (lambda x: p(p(p(x))))
five = lambda p: (lambda x: p(p(p(p(p(x))))))
fifteen = lambda p : (lambda x: p(p(p(p(p( \
p(p(p(p(p( \
p(p(p(p(p(x))))))))))))))))
hundred = lambda p: (lambda x: p(p(p(p(p(p(p(p(p(p( \
p(p(p(p(p(p(p(p(p(p( \
p(p(p(p(p(p(p(p(p(p( \
p(p(p(p(p(p(p(p(p(p( \
p(p(p(p(p(p(p(p(p(p( \
p(p(p(p(p(p(p(p(p(p( \
p(p(p(p(p(p(p(p(p(p( \
p(p(p(p(p(p(p(p(p(p( \
p(p(p(p(p(p(p(p(p(p( \
p(p(p(p(p(p(p(p(p(p(x)))))))))))))))))))))))))))) \
))))))))))))))))))))))))))) \
))))))))))))))))))))))))))) \
)))))))))))))))))))
def to_int(func):
return func(lambda n: n + 1)(0)
print to_int(zero)
print to_int(one)
print to_int(two)
print to_int(three)
print to_int(five)
print to_int(fifteen)
print to_int(hundred)
数字 0 到 15 可以正常工作,但如果我尝试创建数字 100,由于以下错误,文件将无法运行:
s_push:解析器堆栈溢出
MemoryError
我必须将其注释掉才能使文件完全运行。
这种很糟糕——有什么办法可以绕过这个限制,这样我就可以任意嵌套 lambdas 和函数调用,而不会导致 Python 崩溃和内存不足?
或者,是否有某种 lambda 演算技巧可以用来表达数字 100,而无需太多嵌套函数?