0

評価:

((((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

    • 置換3->x(lambda (y) (lambda (x) (+ x y))

    • (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

    • 代用4 -> yする(lambda (y) (lambda (x) (+ 3 y))

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

    • 評価(lambda (y) (+ 3 4)) -> (lambda (y) (7))

      • 置換5-> ?

そして、私は立ち往生しています。

4

3 に答える 3

2

これを個々の「定義された」手順に分解することをお勧めします。

(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

于 2008-10-30T07:48:19.817 に答える
1
-substitute 3 -> x in (lambda (y) (lambda (x) (+ x y))
-(lambda (y) (lambda (x) (+ 3 y))

まず、これは間違っています。3のすべての出現を代用するのではxなく、無料のものだけを代用します。ここxで置き換えている は、内側のラムダ式によってバインドされているため、自由ではありません。

第二に、一度も使用されていない変数の値を代入することには何の問題もないので、 in の代入5y問題(+ 3 4)なく、yield になります(+ 3 4)

于 2008-10-30T08:04:28.707 に答える
1

あなたの最初の置換は間違っています。xinは、最も外側ではなく、最も(+ x y)内側の によってバインドされます。lambdaこれは、その置換の結果がちょうど であることを意味し(lambda (y) (lambda (x) (+ x y)))ます。「3紛失」です。(おそらく、置換規則を調べて、それらを段階的に適用して、よりよく理解する必要があります。)

これに関係なく、終了するには(lambda (y) (7))(または(lambda (y) (+ 4 x))上記を修正した場合) 5to get 7(または(+ 4 5)which が に評価される9) を適用できます。

于 2008-10-30T08:05:41.933 に答える