問題タブ [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.

0 投票する
4 に答える
574 参照

functional-programming - 外部システムからの状態を機能的に処理する方法は?

私は最近、関数型プログラミングに取り掛かり、いくつかの種類の副作用を参照透過的な方法で処理するいくつかの方法を学びました。

  • 変数の更新などの変更可能な状態の State モナド
  • コンソールからの読み取り/コンソールへの書き込みなどの I/O 用の IO モナド
  • グラフィックスや入力デバイス イベントなどの双方向性のためのFRP

しかし、今日の「現実世界の」アプリケーションのほとんどは、複数のユーザーが同時に変更できる外部システム (Web サービス、データベースなど) とインターフェースしており、状態や長時間実行される操作などを持っています。したがって、ケースはそれほど単純ではありません。上記のカテゴリのように: システムにエンティティの状態を問い合わせるか、それを制御しようとした結果は、その状態に依存します。さらに、対話性も要件です。ユーザーが任意にクリックできる GUI がいくつかあり、システムからの変更に自動的に対応する必要がある場合もあります。

純粋関数の利点を最大限に活用して、この種のアプリケーションを設計および実装するパターンは何ですか? または、上記のアプローチのいくつかを、私が考えもしなかった方法でこの問題に適用できますか? 言語 (Java や Scala など) は 100% の純度を強制するわけではないので、実際の経験に裏付けられた実用的なソリューションに興味があります。

0 投票する
2 に答える
212 参照

api - 機能的に純粋な言語でAPIにどのように接続しますか?

純粋に関数型言語で、副作用を導入せずにAPIに接続する方法を知りたいだけです。

0 投票する
5 に答える
2323 参照

algorithm - 純粋関数型セット

純粋に機能的なセットを実装するアルゴリズムはありますか?

期待される操作は、和集合共通部分要素ですか?空?隣接します。

ただし、これらは難しい要件ではありません。それらのサブセットのみを実装するアルゴリズムを学習できれば幸いです。

0 投票する
3 に答える
233 参照

haskell - 外部スコープで定義された関数を使用しても、参照透過性が損なわれないのはなぜですか?

Haskellを学んでいます。私が正しく理解していれば、Haskellの単純な関数は常に参照透過性です。それは、その出力が渡された引数のみに依存することを意味すると思いました。

ただし、関数は、外部スコープで定義されたf別の関数を呼び出すことができます。gしたがって、その意味で、fの戻り値はの定義に依存しますg。また、関数gはパラメーターとして渡されませfん-少なくとも明示的には渡されません。これは参照透過性を壊しませんか?

0 投票する
2 に答える
133 参照

functional-programming - 参照透過性/機能の純度はベストプラクティスですか、それとも好みに依存しますか?

機能の純度がベストプラクティスと見なされるかどうか、またはそれが好みやプログラミングスタイルに依存するかどうかについて、コンセンサスがあるかどうかを知りたいです。言い換えれば、これは議論の余地がありますか、それともこれは効果的に決定されていますか?私が見つけたすべての情報は、それが不利な点のない美徳であることを示唆しています。これは本当ですか?

地域の実践コミュニティのベストプラクティスのリストをまとめたいと思います。また、これをどの程度含めるべきかを知りたいと思います。

0 投票する
2 に答える
1099 参照

haskell - Data.SetにO(log(n))を挿入するにはどうすればよいですか?

のドキュメントをData.Set見ると、ツリーへの要素の挿入がO(log(n))であると言及されていることがわかりました。ただし、参照透過性ではO(n)に前のツリーの完全なコピーを作成する必要があるため、直感的にはO(n * log(n))(またはO(n)?)であると予想します。

(:)たとえば、ここでは完全なリストをコピーする必要がないため、O(n)の代わりにO(1)にすることができることを理解しています。新しいリストは、コンパイラーによって、最初の要素と古いリストへのポインターになるように最適化できます(これはコンパイラーであり、言語レベルではないことに注意してください)。ただし、値をに挿入するData.Setには、リストの最適化に似たものがあるとは思えないほど、私には非常に複雑に見えるリバランスが必要です。Set docsで参照されている論文を読んでみましたが、質問に答えることができませんでした。

では、要素を二分木に挿入するには、(純粋に)関数型言語でO(log(n))を使用するにはどうすればよいでしょうか。

0 投票する
3 に答える
1369 参照

haskell - getArgs と getProgName IO アクションはなぜですか?

私は現在、「Learn You a Haskell for Great Good」で Haskell を学ぼうとしている完全な初心者です。コマンドライン引数の操作方法を説明するセクションにたどり着きましたが、何かが私を悩ませています。

私の理解 (およびhaskell.org の定義) から、アクションは副作用をカプセル化するためのものです。コマンドライン引数は、プログラムの特定のインスタンスに対する不変の入力getProgName :: IO StringですgetProgName :: String。別の言い方をすれば、純粋な関数が呼び出されないようにするポイントは何getProgNameですか?

アップデート

これまでのところ、この質問に対していくつかの素晴らしい答えがありました。Don Stewart の記事が最も単純で簡潔なものであると私は認めますが、 Conal の記事(関連するブログ投稿を含む) は一読の価値があります。

0 投票する
1 に答える
393 参照

haskell - Haskellのポリモーフィズムによる参照透過性

私が関数を持っているとしましょう:

(+1)を次のように抽象化したい:

これは明らかに機能しませんが、型署名を指定すると機能します。

ここで、hをパラメーターとして渡すことにより、関数をさらに抽象化するとします。

内側のaが外側のaと同じではないというエラーが表示されます。

この関数を正しく書く方法を知っている人はいますか?gポリモーフィック関数をに渡して、ポリモーフィックに使用したいと思いfます。

私は今、非常に異なるプロジェクトでこの状況に何度も遭遇しましたが、良い解決策を見つけることができませんでした。

0 投票する
4 に答える
3824 参照

haskell - Haskell - IO 関数内で純粋関数を使用するにはどうすればよいですか?

IO 関数内で純粋関数を使用するにはどうすればよいですか? :-/

例: ファイル (IO 関数) を読み取っていて、参照透過性を持つ純粋な関数を使用して、そのコンテキスト (文字列) を解析したいと考えています。

純粋関数とIO関数という世界が分かれているようです。どうすればそれらを橋渡しできますか?