質問
用語はそうであるように見えます 定義されています 違うが、私はいつも一方が他方を暗示することを考えていました。表現が参照的に透明であるが、純粋ではない場合、またはその逆ではない場合、私は考えられません。
ウィキペディアは、これらの概念のために別々の記事を維持し、次のように述べています。
から 参照透明性:
式に含まれるすべての関数が純粋な関数である場合、式は参照的に透明です。また、その値が破棄され、副作用が取るに足らない場合、いくつかの不純な関数を式に含めることができます。
から 純粋な表現:
純粋な式を構築するには、純粋な機能が必要です。 [...]純粋な表現は、多くの場合、参照的に透明であると呼ばれます。
これらの声明は混乱していると思います。いわゆる「不純な関数」からの副作用が 取るに足らない それらを実行しないことを許可するのに十分です(つまり、そのような関数への呼び出しをそのものに置き換えます 価値)プログラムを実質的に変えることなく、そもそも純粋だったと同じですよね?
純粋な表現と参照的に透明なものとの違いを理解するためのより簡単な方法はありますか?違いがある場合、それが高く評価されることを明確に実証する例の式。
解決
私が私の知人の3人の理論家のいずれかを1か所に集めた場合、少なくとも2人は「参照透明性」という用語の意味に同意しません。そして、私が若い学生だったとき、私の指導者は、たとえあなたが専門文献だけを考慮しても、「参照的に透明」というフレーズが少なくとも3つの異なることを意味するために使用されることを説明する論文を私に与えてくれました。 (残念ながら、その論文は、まだスキャンされていない再版の箱のどこかにあります。GoogleScholarを検索しましたが、成功しませんでした。)
私はあなたに知らせることはできませんが、私 できる あきらめることをお勧めします:先のとがった言語理論家の小さな幹部でさえ、それが何を意味するかについて同意できないため、「参照的に透明」という用語は 有用ではありません. 。だからそれを使わないでください。
PSプログラミング言語のセマンティクスを使用するトピックについては、ウィキペディアは信頼できません。私はそれを修正しようとしてあきらめました。ウィキペディアンのプロセスは、安定性と正確性に対する変化と一般的な投票を考慮しているようです。
他のヒント
すべての純粋な機能は、必然的に参照的に透明です。定義上、彼らは渡されたもの以外にアクセスできないため、彼らの結果は彼らの議論によって完全に決定されなければなりません。
ただし、純粋ではない参照的に透明な機能を持つことができます。 intが与えられた関数を書くことができます i
, 、次に乱数を生成します r
, 、減算 r
それ自体から、それを置きます s
, 、その後戻ってきます i - s
. 。明らかに、この関数は乱数を生成しているため、不純です。ただし、参照的に透明です。この場合、例は愚かで不自然です。ただし、例えば、Haskell、 id
機能はタイプです a - > a
一方、私の stupidId
機能はタイプです a -> IO a
副作用を利用していることを示します。プログラマーが、その関数が実際に参照されていることを外部の証明を保証できる場合、彼らは使用できます unsafePerformIO
を取り除く IO
タイプから離れます。
私はここで私が与えた答えについては少し確信が持てませんが、確かに誰かが私たちをある程度の方向に向けます。 :-)
「純度」は一般に、「副作用の欠如」を意味すると考えられています。その評価に副作用がない場合、表現は純粋であると言われています。副作用とは何ですか?純粋に機能的な言語では、副作用とは、単純なベータルールではないものです(関数アプリケーションを評価するためのルールは、正式なパラメーターのすべての自由な発生を実際のパラメーターに置き換えるのと同じです)。
たとえば、線形(または一意性を備えた機能的言語では、この区別は現時点では気にするべきではありません)タイプの(制御された)突然変異が許可されています。
ですから、「純度」と「副作用」が何であるかを整理したと思います。
参照透明性(あなたが引用したウィキペディアの記事によると)は、プログラムの意味を変更せずに、変数を示す(略語、略)と置き換えることができることを意味します(ところで、これは取り組むのが難しい質問であり、私はここでそうしようとしません)。したがって、「純度」と「参照透明性」は実際には異なるものです。「純度」は、「実行時に副作用を生成しない」と「純度」は、「参照透明度」は変数と表現を関連付ける特性であるという意味のある意味のあるものです。それは、「変数を示すものに置き換えることができる」という意味であり、意味します。
うまくいけば、これが役立ちます。
これらのACCU2015トークのスライド 参照透明性のトピックについて素晴らしい要約を持っています。
スライドの1つから:
言語は、(a)すべてのサブエクスペッションを値に等しい他の任意の任意のものに置き換えることができ、(b)特定のコンテキスト内の式のすべての発生が同じ値を生成する場合、参照的に透明です。
たとえば、プログラム標準出力に計算を記録する関数(したがって、純粋な関数ではありません)を使用することができますが、計算を記録しない同様の関数によってこの関数の呼び出しを置き換えることができます。 。したがって、この関数には 参照透明性 財産。しかし...上記の定義は、スライドが強調するように、表現ではなく言語に関するものです。
...]そもそも純粋だったのと同じですね。
私たちが持っている定義から、いいえ、そうではありません。
純粋な表現と参照的に透明なものとの違いを理解するためのより簡単な方法はありますか?
試す 上記のスライド.
ジョン・ミッチェルが彼の本で書いたことを引用します プログラミング言語の概念. 。私はそれを線で覚えていませんが、彼は純粋な機能的言語が宣言的な言語テストに合格する必要があると定義しています。
「x1、...、xnの特定の減速の範囲内で、変数x1、...、xnのみを含む式eのすべての発生は同じ値を持っています。」
要するに、他のすべての人が副作用や副作用がないと言及したように(副作用の「欠如」)。
言語学では、名前または名詞句は、含まれる文の意味を変更せずに同じ指示対象者と別の名詞句に置き換えることができる場合、参照的に透明であると見なされます。
これは最初に保持されますが、2番目のケースでは奇妙になります。
ケース1:「ウォルターが彼の新しいものに入るのを見ました 車."
そして、ウォルターがセントロを所有している場合、指定された文でそれを次のように置き換えることができます。
「ウォルターが彼に入るのを見ました セントロ"
最初に反対:
ケース#2:彼は呼ばれました ウィリアム・ルーファス 彼の読み物のために。
ルーファスはやや赤く、イングランドのウィリアム4世を参照していました。
"彼は呼ばれました ウィリアムIV 彼の読んだひげのために。」
伝統的な方法は、プログラムの意味を変更せずにプログラム内のどこでも、ある式を別の式に置き換えることができる場合、言語は参照的に透明です。
したがって、参照透明性は純粋な機能的言語の特性です。また、プログラムが副作用がない場合、このプロパティは保持されます。
そのため、あきらめてすごいアドバイスですが、この文脈でも見栄えが良いかもしれません。