2

私は関数プログラミングに関するコースラのコースに取り組んでいます。ある時点で、コールバイバリューとコール別の評価技術の違いについて議論しています。彼らは、彼らが私を混乱させるいくつかのポイントを言っている:値による呼出と名前による同値

  1. 減少表現は純粋な機能で構成され、
  2. 両方の評価が終了しますと

    両方の技術がある限り同じ最終値まで下げます

ラムダ定理と思われる。

「縮小表現は純粋な機能を重視している」ということを私に説明してください。

+2

https://en.wikipedia.org/wiki/Pure_functionを見ましたか? – Bergi

+0

そのコースには他の学習教材への参照がかなりたくさんあります。それを最初にチェックするか、コースフォーラムを使うのが良いでしょう。 – Pavel

+1

@Rodrigoこれはラムダ計算がコンフルエントである[Church-Rosser定理](https://en.wikipedia.org/wiki/Church%E2%80%93Rosser_theorem)の非公式の記述です。あなたが参照するフレーズはおそらくそこにあるのは、スカラの定理を使うことは、言語の特定の純粋なサブセットにしか適用されないので、用語のわずかな乱用です。 – phg

答えて

4

純粋な関数は、副作用がないものです(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変数の値が変更されるため、大きな違いがあります。

関連する問題