問題タブ [referential-transparency]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
programming-languages - プログラミング言語のすべてが式である場合、それは参照透過的ですか?
何度も検索しても見つからなかったが、どこかで新しいプログラミング言語を作成する人がいる場合、すべてが式である場合、完全に参照透過的であるということをどこかに準備しました。
参照透過性に関するいくつかの質問は、Ruby や Perl などの特定の言語がほとんどすべてを式として持っていることを示しています。
これは可能ですか/存在しますか?
私がそれを理解していれば、プログラミング言語が完全に参照透過的である場合、これは副作用がまったくないことを意味し、副作用のない完全なプログラミング言語を持つことは可能ですか?
そして、タイトルの主な質問は、完全に参照透過的なプログラミング言語を作成するという目標がある場合、言うまでもなく、すべてが式になるということでしょうか?
java - Java8 が参照透過性を使用する場合
Java 8 は参照透過性を使用することに注意してください 。
この RT を検出するために、次のような多くのコードをテストします。
コンソール :
2回出現する要素があっても、Java 8はトリプルメソッドを実行することに注意してください3
.
Istvan の解釈によると、私の質問は次のとおりです。
トリプルが参照透過的である場合、コンパイラはトリプル(3)への繰り返し呼び出しを最適化しないのはなぜですか?
haskell - 型推論は参照透過性を妨げます
Haskell 言語が参照透過性に関して提供する正確な約束/保証は何ですか? 少なくとも Haskell のレポートでは、この概念について言及されていません。
表現を考える
そして、この式が 1 かどうかを知りたいのです。安全のために、これを 2 回実行します。
(True,False)
GHCi 7.4.1で提供されるようになりました。
明らかに、この式は今や参照的に不透明です。プログラムがそのような動作の対象であるかどうかをどのように判断できますか? 私はプログラム全体を氾濫させることができます::
が、それは非常に読みやすいものにはなりません。私が見逃しているHaskellプログラムの他のクラスはありますか? それは完全に注釈付きのものと注釈なしのものの間ですか?
(私がSOで見つけた唯一の関連する質問とは別に、これには何か他のものがあるに違いありません)
scala - 可変クラスを使用した「参照透過性」についての私の理解は正しいですか?
「関数型プログラミング in scala」の本から、式の「参照透過」の定義がわかります。
式 e は、すべてのプログラム p について、p 内のすべての e の出現を、p の意味に影響を与えることなく e を評価した結果で置き換えることができる場合、参照透過的です。
参照透過かどうかわからないコード例がいくつかあります。
scala.collection.mutable.StringBuilder
変更可能なクラスである例で使用します
1.
ここのコードは、 を使用する完全なコード全体であるとしますx
。
x
式は参照透過式と言えますか?
x
その値をすべて変更してnew StringBuilder("Hello")
も、プログラムの観察可能な動作は変更されません。
2.
ここのコードが、 と を使用する完全なコードであるとしx
ますy
。
y
プログラムでまったく使用されていないため、参照が透過的であると言えますか?
3.
x
参照透過性があると言えますか? どのように値に置き換えても、戻り値は変更されないためです。
for all programs p
PS: おそらく主な問題は、意味がわからないことです。既存の完全なコードを意味するのでしょうか? または、追加される可能性のあるコードはありますか?
scala - return は参照透過性を壊しますか?
私はScala WartRemoverツールの説明を読んでいて、彼らが持っていたポイントの 1 つに混乱していました。説明にはこうありました。
return
参照透過性を壊します。安全な方法で計算を終了するようにリファクタリングします。
これは私には意味がありません。どちらの例も参照透過的に見えます。return
関数が参照の透過性を破る可能性がキーワードによって高くなる方法はありますか? 私は彼らの主張を完全に誤解しているだけですか?
r - ネストされた R 関数のスコープ
R でのスコーピングを理解しているかどうかわからない、正しいことをしているとは思わない例があります。この例は、J. Fox による「R および S-PLUS Companion to Applied Regression」から変更されています。
私がリストで予想したことは、恒等関数、平方関数、および立方関数をそれぞれ計算する 3 つの関数が、それらの引数をすべて 3 乗した場所にあることです。ラップリーを使用しない場合、期待どおりに機能します。
これを驚くべき、または不安に思うのは私だけでしょうか? それには深い満足のいく理由がありますか。ありがとう
PS: Google と SO で検索を実行しましたが、おそらくこの問題に関連するキーワードが一般的であるため、手ぶらで出てきました。
PPS: この例は、純粋な好奇心ではなく、パッケージのクイックチェックの実際のバグによって動機付けられています。バグの回避策があります。ご心配ありがとうございます。これは何かを学ぶということです。
もちろん、質問を投稿した後、問題を明確にする別の例のアイデアが得られます。
p は、lapply に隠されているループ変数と同じ役割を果たします。p は、この場合は make.power への参照のように見えるメソッドによって渡されます。Make.power はそれを評価せず、ポインターを保持するだけです。私は正しい軌道に乗っていますか?
haskell - オブジェクトに関連付けられた状態を純粋に変更する方法は?
Haskell には、次のようなコンテナがあります。
このコンテナは平坦化されたツリーです。そのアクセサは、が格納されている適切なバケットを見つけるために、ベクトルを介して(!)
バイナリ ( ) 検索を実行します。log(N)
index
連続したアクセスは同じバケットにある可能性が高いため、これは次の方法で最適化できます。
難点はそのlast accessed bucket
部分です。JavaScript では、コンテナ オブジェクトの隠し変数を不純に変更するだけです。
これは単なる最適化であり、実行された分岐に関係なく結果は同じであるため、参照透過性が損なわれることはないと思います。Haskell で、ランタイム値に関連付けられた状態を純粋に変更できないのはどうしてですか?
〜
私は2つの可能な解決策を考えました。
ポインターを値にリンクするグローバルで変更可能なハッシュマップ
lastBucket
であり、unsafePerformIO を使用してそれに書き込みます。しかし、オブジェクトのランタイム ポインタ、または少なくとも何らかの一意の ID を取得する方法が必要です (方法は?)。、 に追加のフィールドを追加し、
Container
何らかのlastBucket :: Int
方法で 内(!)
で純粋に変更せず、そのフィールドを内部と見なします (明らかに参照透過性を壊すため)。
functional-programming - アプリケーションがスタックを変更した場合、関数型プログラミングの「純粋」とはどういう意味ですか?
純粋関数:
- 特定の入力に対して常に同じ結果を返す
- 副作用を生じさせない
これにより、プログラムの動作を変更せずに式を値に置き換えることができる参照透過性が得られます。
これは、プログラムの実行環境でエンティティの破壊的な変更 (更新) を除外する場合、プログラムは純粋に機能していると言えることを示しています。
このコメンテーターは次のように書いています。
アプリケーション自体がミューテーションのプロトコル (スタック) であることを考慮して、FP 設定の「純粋」が実際に意味するものに取り組んでいます。
私の質問は、アプリケーションがスタックを変更した場合、関数型プログラミングの「純粋」とはどういう意味ですか?