1

例。これが私たちのJavaScriptコードだとします:置換モデルはクロージャのために機能しますか?あるいは、環境モデルが必要ですか?

let a = x => { 
    let y = x * 2 
    return z => x + y + z 
} 
let b = a(1) 
let c = b(2) 

代替モデルを使ってこれを評価できますか、環境モデルが必要ですか?

私はそうのように始まった:

let c = ((x => { 
    let y = x * 2 
    return z => x + y + z 
})(1))(2) 

しかし、私は(2と呼ばれる)外側の式を評価することができます前に、私は(1と呼ばれる)内側の式を評価する必要があります。しかし、代用のためには、それは常に外部にあります。

これは代替モデルが不十分であることを示していますか?それとも、アウト・イン・アウトだけでなく、アウト・イン・アウトを評価することもできますか?あるいはそれを見るための他の方法がありますか?

+1

コードでバインドされたスコープ変数が変更されない場合は、環境モデルは必要ありません。 – Bergi

+1

純粋な関数では、評価の順序は関係ありません。しかし、外部入力の場合でも、アプリケーション操作の左側を関数に評価してから適用する必要があります。 – Bergi

答えて

3

置換モデルはクロージャーで機能します。基本的には、バインディングをバインドされた値で置き換えます。環境モデルは必要ありません。

const b = a(1)     // == 
const b = z => 1 + (1 * 2) + z 

const c = b(2)    // == 
const c = 1 + (1 * 2) + 2 // == 
const c = 5    

それはあなたが本当にあなたが環境モデルを必要な場所(イベントでは、あなたが実際にそれを再バインド)letを使用する必要がある場合のみです。

評価順になると、a(1)(2)のような2つの呼び出しでは、最初にa(1)という結果で呼び出されるので、最初に2という引数で2番目の呼び出しを行うことはできません。したがって、a(1)の結果を知る必要がありますので、最初にそれを置き換えてから、その結果の次の呼び出しを行う必要があります。

let c = (x => { 
    let y = x * 2 
    return z => x + y + z 
})(1)(2) 
// substituting 1 for x ==> 
let c = (z => 1 + 2 + z)(2) 
// substituting 2 for z ==> 
let c = 1 + 2 + 2 
+0

私は参照してください。代替のための操作の順序はどうですか?どちらの方法でも同じ結果が得られるため、インサイドアウトまたはアウトインインを評価するかどうかは関係ありませんか? – bcherny

+0

@bcherny私は答えに追加しました。 – Sylwester

+0

私は見る - ありがとう! – bcherny

関連する問題