【问题标题】:What am I doing wrong with this Scheme evaluation?我在这个方案评估中做错了什么?
【发布时间】:2008-10-30 07:34:39
【问题描述】:

评估:

((((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4) 5)

这就是我所做的:

  • 评估((((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4) 5)

    • 评估5 -> 5
  • 评估(((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3) 4)

    • 评估4 -> 4
  • 评估((lambda (x) (lambda (y) (lambda (x) (+ x y)))) 3)

    • 评估3 -> 3
  • (lambda (x) (lambda (y) (lambda (x) (+ x y)))) -> (lambda (x) (lambda (y) (lambda (x) (+ x y))))

  • (lambda (x) (lambda (y) (lambda (x) (+ x y)))) 申请到3

    • (lambda (y) (lambda (x) (+ x y))替换3 -> x

    • (lambda (y) (lambda (x) (+ 3 y))

    • 评估(lambda (y) (lambda (x) (+ 3 y)) -> (lambda (y) (lambda (x) (+ 3 y))

    • apply (lambda (y) (lambda (x) (+ 3 y))4

    • (lambda (y) (lambda (x) (+ 3 y))替换4 -> y

    • (lambda (y) (+ 3 4))

    • 评估(lambda (y) (+ 3 4)) -> (lambda (y) (7))

      • 替换5 -> ?

然后我就卡住了。

【问题讨论】:

    标签: lambda scheme evaluation


    【解决方案1】:

    我建议您将其分解为单独的“已定义”程序。

    (define part1 (lambda (y) (lambda (x) (+ x y)))) ; basically an adder
    (define part2 (lambda (x) part1))  ; just return part1, x has no effect
    

    现在拨打(((part2 3) 4) 5) => 9

    【讨论】:

      【解决方案2】:
      -substitute 3 -> x in (lambda (y) (lambda (x) (+ x y))
      -(lambda (y) (lambda (x) (+ 3 y))
      

      首先,这是错误的。您不能用3 替换所有出现的x,只替换免费的。您在此处替换的 x 受内部 lambda 表达式约束,因此不是免费的。

      其次,将值替换为从未使用过的变量并没有错,因此将y 替换为(+ 3 4) 中的5 很好,并产生(+ 3 4)

      【讨论】:

        【解决方案3】:

        你的第一个替换是错误的; (+ x y) 中的 x 由最里面的lambda 绑定,而不是最外面的。这意味着该替换的结果只是(lambda (y) (lambda (x) (+ x y)))3 已“丢失”。 (也许您应该查找替换规则并逐步应用它们以更好地掌握它。)

        不管怎样,完成后,您仍然可以将(lambda (y) (7))(或(lambda (y) (+ 4 x)),如果您解决上述问题)应用到5,以获得7(或(+ 4 5),其计算结果为9)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多