私は関数プログラミングに関するコースラのコースに取り組んでいます。ある時点で、コールバイバリューとコール別の評価技術の違いについて議論しています。彼らは、彼らが私を混乱させるいくつかのポイントを言っている:値による呼出と名前による同値
- 減少表現は純粋な機能で構成され、
- 両方の評価が終了しますと
両方の技術がある限り同じ最終値まで下げます
ラムダ定理と思われる。
「縮小表現は純粋な機能を重視している」ということを私に説明してください。
私は関数プログラミングに関するコースラのコースに取り組んでいます。ある時点で、コールバイバリューとコール別の評価技術の違いについて議論しています。彼らは、彼らが私を混乱させるいくつかのポイントを言っている:値による呼出と名前による同値
両方の技術がある限り同じ最終値まで下げます
ラムダ定理と思われる。
「縮小表現は純粋な機能を重視している」ということを私に説明してください。
純粋な関数は、副作用がないものです(IOを実行するか、関数にローカルでない値を変更するなど)。純粋な関数の例は次のようになります。
def inc(x: Int) = x+1
不純な関数の例は次のようになります。
var sum = 1
def addToSum(x: Int) = {
sum += x
sum
}
だから今だけ、彼らはその引数を取るかどうかによって異なりいる、のは、次の2つの方法を考えてみましょう名前または値によって:今、私たちは純粋な機能でこれらの両方を使用する場合
def doubleByValue(x: Int) = x + x
def doubleByName(x: =>Int) = x + x
、結果は同じです:
doubleByValue(inc(2)) // => 6
doubleByName(inc(2)) // => 6
しかし、我々は不純な機能にそれらを適用した場合、結果は異なります
sum = 1 // Let's reset sum, so the result isn't affected by previous uses
doubleByValue(addToSum(2)) // => 6, the value of `sum` is now 3
sum = 1 // Let's reset sum, so the result isn't affected by previous uses
doubleByName(addToSum(2)) // => 8, the value of `sum` is now 5
違いByValue
バージョンは一度それを呼び出すのに対し、ByName
バージョンは、二回関数を呼び出し、二つの結果を追加することです結果を保存し、それ自身に追加します。
純粋な関数の場合、これは全く同じ意味を持ちません。同じ引数を指定すると、常に同じ結果が返されるため、一度呼び出すと保存された結果を2回使用するか、パフォーマンスのために)。
不正な関数の場合、関数が呼び出されるたびにsum
変数の値が変更されるため、大きな違いがあります。
https://en.wikipedia.org/wiki/Pure_functionを見ましたか? – Bergi
そのコースには他の学習教材への参照がかなりたくさんあります。それを最初にチェックするか、コースフォーラムを使うのが良いでしょう。 – Pavel
@Rodrigoこれはラムダ計算がコンフルエントである[Church-Rosser定理](https://en.wikipedia.org/wiki/Church%E2%80%93Rosser_theorem)の非公式の記述です。あなたが参照するフレーズはおそらくそこにあるのは、スカラの定理を使うことは、言語の特定の純粋なサブセットにしか適用されないので、用語のわずかな乱用です。 – phg