使用する
(define (double fn) (lambda (x) (fn (fn x))))
方法を説明できますか
((((double double) double) 1+) 0)
16に等しい?? 置換を使用してどのように機能しますか?
このdouble
関数は、引数として別の関数を受け入れ(その関数を呼び出しましょうfn
)、任意の1つの引数を受け入れる関数を返します。その引数をfn
に渡し、次にその結果をに渡します。fn
これが結果です。
例えば:
> ((double add1) 1)
3
1を呼び出してadd1
2を返し、次に2を呼び出しadd1
て結果3を返します。
あなたの例では、doubleをそれ自体に渡すので、これで、与えられたときに、1+
与えるものすべてに4を追加するプロシージャができました(2つdouble
の'があり、それぞれdouble
が2つの'を呼び出すため1+
)。ただし、新しいプロシージャを別の double
プロシージャに渡すと、8個になります(2個はすでに作成double
した4個すべてによって呼び出されます)。double
これらの8つの呼び出しはそれぞれ1+
2回行われます。
したがって、この新しいプロシージャは1+
、指定した引数に対して2回、8回呼び出します。したがって、渡した引数に16が追加されます。
置換を使用してどのように機能しますか?
Racket を使用している場合は、DrRacket のステッパー ツールを「ラムダを使用する中級者向け」言語で使用して、正確な置換手順を確認できます。