問題タブ [lenses]

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 投票する
2 に答える
2105 参照

haskell - レンズの組み合わせ

レンズライブラリを使用して、次のように個々のターゲットに変更関数を適用できます。

これらの個々のレンズ (_1および_3) を組み合わせて、両方のターゲットに対してこの更新を一度に実行できるようにするにはどうすればよいですか? 私は次の精神で何かを期待しています:

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

haskell - Getter を Fold に結合する

次の質問の精神で:

複数のGetterを単一のFoldに結合する方法を探しているので、次のようになります。

これは次のようになります。

しかし、上記のコードは実際には次のメッセージで失敗します。

では、どうすればこれを達成できますか?これはまったく可能ですか?

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

haskell - Control.Lens から Fold をフィルタリングするためにモナド アクションを使用できますか?

Control.Lens.Fold には が含まれていますfiltered。これを使用して、モナド アクションを適用する前にリストをフィルター処理できます。対応するものはないようですがfilteredM、その効果を得る方法はありますか?

明確にするために、私が持っていると言います

which returnactionMの各要素にどのように適用できますか?xspredMTrue

predM重要な制約は、 の最初の呼び出しの前に のすべての呼び出しを順序付けたいということですactionM。そのため、リストに対して 2 つのパスを作成する方法が必要です。predMandを組み合わせactionMて単一の関数にすることはできません。

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

haskell - レンズのリストを生成するには?

オブジェクトのリストがあるコードに共通のパターンがあり、それらを関数に渡してchooseユーザーに選択させます。

ただし、選択した要素にアクセスするにはパーシャルを使用する必要があるため、 を返すのIntは残念です。(!!)これを避けるために、私は

ここで、リストの各要素にアクセスするためのレンズのリストを渡します。そうすれば、実際に存在するかどうかを気にせずに、レンズの反対側にあるオブジェクトを変更しても安全だと確信できます。

このようなレンズのリストを作成するにはどうすればよいですか? 効果的に、私は必要です

おまけとして、より一般的なもの

トラバーサルがアクセスする各ポイントのレンズを作成することも素晴らしいでしょう

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

scala - Scala で 2 つのケース クラスをマージしますが、型が深くネストされており、レンズ ボイラープレートがありません

このケースクラスの質問に似ていますが、ひねりがあります:

プロパティとしていくつかの深くネストされたケース クラスを持つケース クラスがあります。簡単な例として、

2 つの FooBar ケース クラスをマージして、入力用に存在する値を取得し、それらを既存のインスタンスに適用して、更新されたバージョンを生成したいと思います。

レンズを使用して、深くネストされたプロパティの更新を作成できることはわかっています。ただし、これには多くの定型コードが必要になると思います。すべてのプロパティにレンズが必要であり、親クラスに別の合成レンズが必要です。shapelessでより簡潔なレンズ作成アプローチを使用したとしても、これは維持するのが大変に思えます。

注意が必要なのは optionFoo 要素です。このシナリオでは、両方の要素が Some(value) と共に存在します。ただし、fb1 を fb2 の新しい値で上書きするだけでなく、内部オプション プロパティをマージしたいと考えています。

これらの 2 つの値を最小限のコードでマージする良い方法があるかどうか疑問に思っています。私の直感unapplyでは、ケース クラスでメソッドを使用してタプルを返し、繰り返し処理してタプルを新しいタプルに結合し、そのタプルをケース クラスに適用し直すように指示されています。

これを行うためのより効率的な方法はありますか?

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

haskell - 存在型でレンズを使用できないことを回避するにはどうすればよいですか?

私は Edward Kmett のレンズライブラリを初めて使用しています。

[1] の質問は、存在量指定子が makeLenses を妨害することを説明しています。私はむしろ、何らかの形でレンズを使って実存的なものを使いたいと思っています.

背景として、私はクラスを持っています:

実際の質問については、次のタイプが必要です。

そして、私は次の行に沿って何かを書きたいと思っています:

[1] で説明した理由により、これは機能しません。でコンパイルして GHC にデバッグ情報を求めると-ddump-splices、次のようになります。

スプライス自体は空白です。これは、スプライスによって宣言が生成されないことを示しています。[1] を読んだ今、この部分を期待し、理解しています。

私が知りたいのは、これを行う方法です-問題を回避するにはどうすればよいですか? これで上流に泳がないようにするにはどうすればよいですか? 合成レンズのパスを介して構造の任意の部分にアクセスできるようにしたいのですが、 などのタイプの他のタイプのフィールドがあるため、レンズSet AnyFileで のコンテンツにアクセスできない限りアクセスできませんAnyFile

[1]存在量指定子はテンプレート Haskell (makeLenses) を暗黙のうちに混乱させます。なんで?

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

java - 不変のネストされた構造を更新するレンズまたは同様の方法をサポートする言語はどれですか?

不変性は多くの人から賞賛されていますが、主流のプログラミングで維持するのは難しいと感じました。私の経験では、プログラマーは遅かれ早かれフィールドを再度変更可能にして、更新されたオブジェクトを戻り値とともに渡す必要がある大きなコードのリファクタリングを回避します。

Scala はコピー コンストラクターをある程度サポートしていますが、複雑なオブジェクト構造を更新するための満足のいく解決策は知りません。私は何かを逃したかもしれません。

私が実験した最良の実装は、Haskell の data-lens です。しかし、Haskell を学ぶのは大変です。Java や Scala などの一般的なクロスプラットフォーム プログラミング言語には、どのようなオプションがありますか?

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

haskell - レンズを使用して新しい記録を作成することは可能ですか?

レンズを持つレコード タイプがある場合、基になるレコード アクセサーを使用せずに新しいレコードを作成することは可能ですか?

インスタンスを作成してレンズで変更することはできますが、すべてのレコード タイプに適切なデフォルトがあるわけではありません。Control.Lens には独自の方法がありますか?FooData.Defaultdef

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

list - レンズを使用してリストの特定の場所に挿入する

要素のリストを含むネストされたデータ構造の操作を実行しようとしています。さまざまなアプローチをいじくり回した後、最終的にこれを行うための最良の方法としてレンズに落ち着きました。それらは、構造の特定の要素を見つけて変更するのに完全に機能しますが、これまでのところ、新しい要素を追加する方法に困惑しています。

私が読んだことから、トラバーサルの法則に違反して新しい要素をリストに挿入するため、トラバーサルを技術的に使用することはできません。これは、最初にトラバーサルを使用してそれを行う方法さえ理解できると仮定しています(私はまだ Haskell にかなり弱く、lens パッケージ内のほとんどのものの型シグネチャには頭が回転します)。

具体的に私が達成しようとしているのは、特定のセレクターに一致する要素のリストでいくつかの要素を見つけ、一致した要素の前または後に新しい要素を挿入することです(前または後の関数への異なる引数)マッチ)。Control.Lens には、私がやろうとしていることを達成できる何かが既にありますか? 型シグネチャについての私の理解は弱すぎてそれを見ることができませんか? 私がやろうとしていることを達成するためのより良い方法はありますか?

リストの最初または最後に新しい要素を追加しようとしているだけなら、かなり簡単ですが、途中の特定の場所に挿入するのは難しい部分です。私が書いたレンズ前のコードのいくつかでは、私が望んでいたことを達成するために折り目を使用しましたが、構造のより深くネストされた部分 (折り目の内側の折り目の内側の折り目など) で危険になり始めていたので、私は Control.Lens に目を向けて、その混乱の一部を解き明かそうとしました。