使用する
(define (double fn) (lambda (x) (fn (fn x))))
方法を説明できますか
((((double double) double) 1+) 0)
16に等しい?? 置換を使用してどのように機能しますか?
このdouble関数は、引数として別の関数を受け入れ(その関数を呼び出しましょうfn)、任意の1つの引数を受け入れる関数を返します。その引数をfnに渡し、次にその結果をに渡します。fnこれが結果です。
例えば:
> ((double add1) 1)
3
1を呼び出してadd12を返し、次に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 のステッパー ツールを「ラムダを使用する中級者向け」言語で使用して、正確な置換手順を確認できます。