問題タブ [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.
data-structures - 複数のカーソルを持つジッパーのようなデータ構造
Zipper データ構造は、ツリーをトラバースして現在の位置を維持したい場合に最適ですが、複数の位置を追跡したい場合はどのデータ構造を使用すればよいでしょうか?
例を挙げて説明しましょう:
- #haskell チャンネルの誰かが、yi エディターではカーソル位置を表すためにジッパーが使用されていると教えてくれました。これはすばらしいことですが、カーソルを 2 つにしたい場合はどうすればよいでしょうか。選択を表現したい場合と同様に、選択の開始と終了を知る必要があります。
- ウィキブックの Minotaur の例では、Zipper を使用して、迷宮内の Minotaur の位置を表しています。迷宮に敵を追加したい場合は、ジッパーで敵の位置を表すのが理にかなっています。
- 最後の 1 つは、すべてが始まった私のミニ プロジェクトからのものです。Haskell の学習の一環として、cairo と gth2hs を使用してツリー構造を視覚化しようとしています。ここまではうまくいきましたが、今度は 1 つまたは複数のノードを選択して、たとえば移動できるようにしたいと考えています。選択したノードが複数ある可能性があるため、教科書で定義されているように Zipper をそのまま使用することはできません。
hereで説明されているように、有限マップを含む XMonad の初期バージョンで使用されていたものと同様の、簡単な (単純な?) ソリューションがあります。
つまり、たとえば私のサンプル プロジェクトの場合、選択したノードをインデックス付きマップに格納し、メイン構造内のそれらの表現をインデックスに置き換えます。しかし、このソリューションには多くの欠点があります。上記のリンクで説明されているように、または私の例の場合、すべてのノードの選択を解除するには、ツリー全体を検索する必要があります。
scala - 関数プログラミング言語を使用して内部状態を持つ外部ライブラリを処理する最もエレガントな方法は何ですか?
私は現在 Scala 開発をいじっていますが、物理演算を処理するために box2d などのライブラリと統合する必要があります。問題は、独自の状態を管理する外部ライブラリに依存する必要があることです。box2d ワールドに渡すボディを追跡します。プレイ中の側面を要約するには:
- Box2d は世界の状態を管理し、各ティック/ステップの後にそれらを変更します
- この世界に渡される身体を (FP を使用して) あなたが作成します。
- Box2d はこれらのボディの状態を内部的に変更します
- オブジェクトを追跡するには、オブジェクトへの参照を保持します
- 本体の情報を使用してコードをレンダリングする可能性が高いため、その情報を追跡する唯一の方法は、可変コレクション内のすべての参照を追跡することだと思います。すべてのフレームに耐える必要があります。
だから私の質問は:
これらの参照を (関数型プログラミングの場合) 洗練された方法で追跡するにはどうすればよいでしょうか? また、コードの残りの部分で純粋性に与える影響を最小限に抑えるにはどうすればよいでしょうか?
状態モナドのようなものは、ここでは役に立たないと思います
functional-programming - 関数型言語はどのように副作用をモデル化しますか?
副作用は参照透過性を損なうので、関数型言語のポイントに反しませんか?
haskell - なぜ怠惰は参照透過性とうまくいくのですか?
私はHaskellチュートリアル(Learn You a Haskell)を読んでいました。このチュートリアルでは、怠惰は参照透過性とうまく調和すると著者は述べています。さらに読んだり検索したりしても、その理由はまだわかりません。参照透過性と怠惰の優れている点は理解していますが、それらが一緒になって私を悩ませていることに注意してください。
2つの組み合わせの特別な利点はありますか?
それとも、作者は、彼らが持っていて良かったと言いたかっただけで、それを曖昧に表現したのでしょうか?
exception - エラー関数の呼び出しをキャッチ(および無視)する方法は?
これに対する答えがどこにも見つからなかったのには驚きました。
私はローグライクを書いていて、hackageのncursesライブラリを使用しています。これは、ncursesライブラリのかなり良いラッパーです。ncursesにはこの癖があり、右下の文字を書き込もうとすると、カーソルを次の文字に移動しようとしますが、移動先がないため失敗します。無視できるエラー値を返します。
私の問題は、haskell ncursesライブラリライターがすべての呼び出しでエラーがないか忠実にチェックし、エラーがある場合はエラー「drawText:etcなど」を呼び出すことです。
cやpythonのような他の言語では、これを回避するために、エラーを無視するか、例外をキャッチして無視する必要がありますが、私の人生では、haskellでそれを行う方法を理解できません。エラー関数は回復不能ですか?
必要に応じてその関数のエラーをチェックしないようにライブラリをローカルで変更しますが、そうするのは嫌です。また、カーソルを動かさずに最後の文字を描画できる回避策もありますが、それは不可能だと思います。
java - Javaで参照透過性、不変性などを強制するプロセッサ/プラグインはありますか?
非常に簡単に思えます。たとえば、クラスの @Immutable は、最終フィールド以外のアクセスがあった場合にプロセッサがエラーを発生させます。すべてのコラボレーターも不変であることを保証する必要があります。
@ReferentiallyTransparent (より良い名前?) をメソッドに配置して、すべての呼び出しと共同作業者にも @RefTrans と @Immutable のマークが付けられていることを確認します...
haskell - IO コードによる純粋関数の拡張は可能ですか?
Haskell で単純な XML パーサーを作成しました。関数convertXMLは、XML ファイルのコンテンツを受け取り、さらに処理される抽出された値のリストを返します。
XMLタグの1つの属性に商品画像のURLも含まれており、タグが見つかればダウンロードもできるように機能を拡張したいと考えています。
getImgName関数に IO コードを挿入する方法、または convertXML 関数を不純なバージョンに完全に書き直す必要がありますか?
UPDATE II convertXML 関数の最終バージョン。カールによって提案されたハイブリッドの純粋/不純だがクリーンな方法。返されたペアの 2 番目のパラメーターは、イメージのダウンロードとディスクへの保存を実行し、イメージが保存されているローカル パスのリストをラップする IO アクションです。
scala - 参照透過性
関数型プログラミングで「参照透過」という用語との関連で使用される場合、「観察不能」という用語の意味は何ですか?
language-agnostic - 純度と参照透過性
用語の定義は異なっているように見えます が、私は常に一方が他方を意味すると考えてきました。式が参照透過性であるが純粋ではない場合、またはその逆の場合は考えられません。
ウィキペディアは、これらの概念について個別の記事を維持しており、次のように述べています。
参照透過性から:
式に含まれるすべての関数が純粋関数である場合、式は参照透過性です。また、一部の不純な関数は、それらの値が破棄され、それらの副作用が重要でない場合、式に含めることができます。
純粋な表現から:
純粋式を構築するには純粋関数が必要です。[...]純粋な表現は、参照透過性と呼ばれることがよくあります。
これらのステートメントは紛らわしいと思います。いわゆる「不純な関数」による副作用が、プログラムを大幅に変更せずに実行できない(つまり、そのような関数の呼び出しをその値に置き換える)ほど重要でない場合、それは、そもそもね。
純粋な式と参照透過性の式の違いを理解するためのより簡単な方法はありますか?違いがある場合は、それを明確に示す式の例をいただければ幸いです。
haskell - Haskell のランダム ピボット クイックソート
Ord a => [a]->[a]
まだ単純な署名を持つHaskellで(RANDOM-PIVOTを使用して)クイックソートを実装することは可能ですか?
私はモナドを理解し始めており、今のところ、モナドを「コマンドパターン」のようなものとして解釈しています。これは IO に最適です。
したがって、乱数を返す関数は、実際には IO のようなモナド値を返す必要があることを理解しています。そうしないと、参照透過性が損なわれるからです。また、返されたモナド値からランダムな整数を「抽出」する方法がないことも理解しています。そうしないと、参照の透過性が再び失われるためです。
[a]->[a]
しかし、それが参照透過であるため、ランダムピボットを使用していても、「純粋な」クイックソート機能を実装することは可能だと思います。私の見解では、ランダム ピボットは単なる実装の詳細であり、関数のシグネチャを変更するべきではありません。
OBS:私は実際には特定のクイックソートの問題には興味がありません(したがって、失礼に聞こえたくありませんが、 「マージソートを使用する」または「ランダムピボットは実際にはパフォーマンスを向上させません」という種類の答えを探しているわけではありません) 私は実際に、関数が実際に純粋なものであることを保証できるクイックソートのような場合に、内部で「不純な」関数を使用する「純粋な」関数を実装する方法に興味があります。
クイックソートはその良い例です。