置換モデル(参照透過性(RT)を使用)を大まかに理解しているので、関数を最も単純な部分に分解できます。式がRTの場合、式を分解して常に同じ結果を得ることができます。
はい、直感はかなり正しいです。以下に、より正確な情報をいくつか紹介します。
あなたが言ったように、どんなRT式もsingle
「結果」を持つべきです。つまりfactorial(5)
、プログラム内の式が与えられた場合、常に同じ「結果」が得られるはずです。したがって、特定のものfactorial(5)
がプログラム内にあり、120を生成する場合、展開または計算される「ステップ順序」に関係なく、時間に関係なく、常に120を生成する必要があります。
例:factorial
関数。
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
この説明にはいくつかの考慮事項があります。
まず第一に、異なるRTモデル(適用対通常の順序を参照)は、同じRT式に対して異なる「結果」をもたらす可能性があることに注意してください。
def first(y, z):
return y
def second(x):
return second(x)
first(2, second(3)) # result depends on eval. model
上記のコードfirst
でsecond
は、参照は透過的ですが、最後の式は、通常の順序と適用順序で評価された場合、異なる「結果」を生成します(後者では、式は停止しません)。
....引用符で「結果」を使用することになります。式が停止する必要がないため、値が生成されない場合があります。したがって、「結果」を使用することは、ぼやけているようなものです。RT式computations
では、評価モデルでは常に同じ結果が得られると言えます。
第3 foo(50)
に、プログラム内の2つが異なる場所で異なる式として表示されることが必要になる場合があります。それぞれが、互いに異なる独自の結果を生成します。たとえば、言語が動的スコープを許可している場合、両方の式は、字句的には同じですが、異なります。Perlの場合:
sub foo {
my $x = shift;
return $x + $y; # y is dynamic scope var
}
sub a {
local $y = 10;
return &foo(50); # expanded to 60
}
sub b {
local $y = 20;
return &foo(50); # expanded to 70
}
ダイナミックスコープ誤解それは簡単なものを考えるようにのために作るためx
の唯一の入力でfoo
実際に、それがあるときに、x
そしてy
。違いを確認する1つの方法は、プログラムを動的スコープなしの同等のプログラムに変換することです。つまり、明示的にパラメーターを渡すためfoo(x)
、を定義する代わりに、呼び出し元で明示的に定義foo(x, y)
して渡しますy
。
ポイントは、私たちは常にfunction
考え方の下にあります。式に特定の入力が与えられると、対応する「結果」が与えられます。同じ入力を与える場合、常に同じ「結果」を期待する必要があります。
さて、次のコードはどうですか?
def foo():
global y
y = y + 1
return y
y = 10
foo() # yields 11
foo() # yields 12
foo
再定義があるため、プロシージャはRTを中断します。つまりy
、ある時点で定義し、その後、同じよう に再定義しましたy
。上記のperlの例では、y
sは異なるバインディングですが、同じ文字名「y」を共有しています。ここで、y
sは実際には同じです。そのため、(再)割り当てはメタ操作であると言います。実際、プログラムの定義を変更しています。
大まかに言って、人々は通常、その違いを次のように表現しています。副作用のない設定では、からのマッピングがありinput -> output
ます。「命令型」設定ではinput -> ouput
、state
時間の経過とともに変化する可能性があるというコンテキストがあります。
これで、対応する値の代わりに式を使用する代わりに、変換をstate
必要とする各操作で変換を適用する必要があります(もちろん、式は同じことを参照してstate
計算を実行します)。
したがって、副作用のないプログラムで式を計算するために知っておく必要があるすべてがその個々の入力である場合、命令型プログラムでは、計算ステップごとに入力と状態全体を知る必要があります。推論が最初に大きな打撃を受けます(現在、問題のある手順をデバッグするには、入力とコアダンプが必要です)。メモ化のように、特定のトリックは実際的ではありません。しかし、同時に、並行性と並列性ははるかに困難になります。
RT
あなたが使用してから無効にsubstitution model.
して大きな問題ではない使用することができることは、substitution model
プログラムについての理由にそれを使用しての力ですか?