【问题标题】:Resolving of lambda function解析 lambda 函数
【发布时间】:2018-02-11 08:13:50
【问题描述】:

这是来自在线试卷,但没有有效的解决方案。我很难理解为什么以及如何从这段代码中得到 32 的答案,比如解析括号的优先级如何。在卡住之前,我个人将以下打印表达式解析为 foo(bar)(8),因为 foo 应该将第一个参数最好作为一个值,并将 lambda 中的第二个参数作为一个函数,在这种情况下,bar 和 8 位于不同的地方。

    def bar(x):
        return lambda y: x(x(y))

    def foo(y):
        return lambda x: x(y)

    print((foo(bar)(bar)(lambda x:x*2)(2)))

我将不胜感激详细的答案或任何可以为解决此类 lambdas 奠定基础的网站。我自己学习这个,我对这个主题并没有很好的理解。谢谢。

【问题讨论】:

    标签: python lambda


    【解决方案1】:

    这感觉更像是 lambda 演算练习,而不是 Python 练习。这是扩展所有定义,简化给定表达式的问题。

    foo(bar)(bar)(lambda x:x*2)(2)
    # expanding foo(bar)
    (lambda x: x(bar))(bar)(lambda x:x*2)(2)
    # beta reduction
    bar(bar)(lambda x:x*2)(2)
    # expanding bar(bar)
    (lambda y: bar(bar(y)))(lambda x:x*2)(2)
    # beta reduction
    bar(bar(lambda x:x*2))(2)
    # expanding bar(lambda ...)
    bar(lambda y: (lambda x:x*2)((lambda x:x*2)(y)))(2)
    # let's call g = lambda y: (lambda x:x*2)((lambda x:x*2)(y))
    bar(g)(2)
    # expanding bar(g)
    (lambda y: g(g(y))(2)
    # beta reduction
    g(g(2))
    # expanding innermost g
    g((lambda y: (lambda x:x*2)((lambda x:x*2)(y)))(2))
    # beta reduction
    g((lambda x:x*2)((lambda x:x*2)(2)))
    # beta reduction
    g((lambda x:x*2)(2*2))
    # arithmetic
    g((lambda x:x*2)(4))
    # beta reduction
    g(4*2)
    # arithmetic
    g(8)
    # expanding g
    ...
    

    我想你现在明白了。

    【讨论】:

    • 感谢详细的严谨数学。我看到这里的关键技能是跟踪 lambda 函数的括号及其旁边的括号。得提高我的速度。我对撰写也有类似的问题。似乎无法用你给我的电流来弄清楚。它说 thrice(f)(n) 返回与 f(f(f(n))) 相同的结果。你介意三次简化 lambda 代码体以向我证明这是真的吗?
    • sry 发生格式错误,尝试在上一条评论中进行编辑,但显然我编辑了太多次并且失败了。 def compose(f,g): return lambda x: f(g(x)) def thrice(f): return compose(compose(f,f),f) 证明thrice(f)(n) 返回与f(f(f(n))) 相同的结果
    • 感谢您的帮助,我明白了 :) 对于计算机科学,我还需要哪些其他类型的数学概念?除了这个 lambda 演算的例子。
    • @PrashinJeevaganth 这真的取决于一个人想要学习多少计算机科学。我想说,几乎所有主要的数学领域(包括最抽象的领域)都在计算机科学中找到了一些重要的应用。尝试同时浏览 cs.SE 和 cstheory.SE,您会发现很多参考资料。好消息是你不需要提前知道所有的数学。只要您能够根据需要拿起它就可以了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多