問題タブ [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.
haskell - レンズの組み合わせ
レンズライブラリを使用して、次のように個々のターゲットに変更関数を適用できます。
これらの個々のレンズ (_1
および_3
) を組み合わせて、両方のターゲットに対してこの更新を一度に実行できるようにするにはどうすればよいですか? 私は次の精神で何かを期待しています:
haskell - Getter を Fold に結合する
haskell - Control.Lens から Fold をフィルタリングするためにモナド アクションを使用できますか?
Control.Lens.Fold には が含まれていますfiltered
。これを使用して、モナド アクションを適用する前にリストをフィルター処理できます。対応するものはないようですがfilteredM
、その効果を得る方法はありますか?
明確にするために、私が持っていると言います
which returnactionM
の各要素にどのように適用できますか?xs
predM
True
predM
重要な制約は、 の最初の呼び出しの前に のすべての呼び出しを順序付けたいということですactionM
。そのため、リストに対して 2 つのパスを作成する方法が必要です。predM
andを組み合わせactionM
て単一の関数にすることはできません。
haskell - レンズのリストを生成するには?
オブジェクトのリストがあるコードに共通のパターンがあり、それらを関数に渡してchoose
ユーザーに選択させます。
ただし、選択した要素にアクセスするにはパーシャルを使用する必要があるため、 を返すのInt
は残念です。(!!)
これを避けるために、私は
ここで、リストの各要素にアクセスするためのレンズのリストを渡します。そうすれば、実際に存在するかどうかを気にせずに、レンズの反対側にあるオブジェクトを変更しても安全だと確信できます。
このようなレンズのリストを作成するにはどうすればよいですか? 効果的に、私は必要です
おまけとして、より一般的なもの
トラバーサルがアクセスする各ポイントのレンズを作成することも素晴らしいでしょう
scala - Scala で 2 つのケース クラスをマージしますが、型が深くネストされており、レンズ ボイラープレートがありません
このケースクラスの質問に似ていますが、ひねりがあります:
プロパティとしていくつかの深くネストされたケース クラスを持つケース クラスがあります。簡単な例として、
2 つの FooBar ケース クラスをマージして、入力用に存在する値を取得し、それらを既存のインスタンスに適用して、更新されたバージョンを生成したいと思います。
レンズを使用して、深くネストされたプロパティの更新を作成できることはわかっています。ただし、これには多くの定型コードが必要になると思います。すべてのプロパティにレンズが必要であり、親クラスに別の合成レンズが必要です。shapelessでより簡潔なレンズ作成アプローチを使用したとしても、これは維持するのが大変に思えます。
注意が必要なのは optionFoo 要素です。このシナリオでは、両方の要素が Some(value) と共に存在します。ただし、fb1 を fb2 の新しい値で上書きするだけでなく、内部オプション プロパティをマージしたいと考えています。
これらの 2 つの値を最小限のコードでマージする良い方法があるかどうか疑問に思っています。私の直感unapply
では、ケース クラスでメソッドを使用してタプルを返し、繰り返し処理してタプルを新しいタプルに結合し、そのタプルをケース クラスに適用し直すように指示されています。
これを行うためのより効率的な方法はありますか?
haskell - 存在型でレンズを使用できないことを回避するにはどうすればよいですか?
私は Edward Kmett のレンズライブラリを初めて使用しています。
[1] の質問は、存在量指定子が makeLenses を妨害することを説明しています。私はむしろ、何らかの形でレンズを使って実存的なものを使いたいと思っています.
背景として、私はクラスを持っています:
実際の質問については、次のタイプが必要です。
そして、私は次の行に沿って何かを書きたいと思っています:
[1] で説明した理由により、これは機能しません。でコンパイルして GHC にデバッグ情報を求めると-ddump-splices
、次のようになります。
スプライス自体は空白です。これは、スプライスによって宣言が生成されないことを示しています。[1] を読んだ今、この部分を期待し、理解しています。
私が知りたいのは、これを行う方法です-問題を回避するにはどうすればよいですか? これで上流に泳がないようにするにはどうすればよいですか? 合成レンズのパスを介して構造の任意の部分にアクセスできるようにしたいのですが、 などのタイプの他のタイプのフィールドがあるため、レンズSet AnyFile
で のコンテンツにアクセスできない限りアクセスできませんAnyFile
。
java - 不変のネストされた構造を更新するレンズまたは同様の方法をサポートする言語はどれですか?
不変性は多くの人から賞賛されていますが、主流のプログラミングで維持するのは難しいと感じました。私の経験では、プログラマーは遅かれ早かれフィールドを再度変更可能にして、更新されたオブジェクトを戻り値とともに渡す必要がある大きなコードのリファクタリングを回避します。
Scala はコピー コンストラクターをある程度サポートしていますが、複雑なオブジェクト構造を更新するための満足のいく解決策は知りません。私は何かを逃したかもしれません。
私が実験した最良の実装は、Haskell の data-lens です。しかし、Haskell を学ぶのは大変です。Java や Scala などの一般的なクロスプラットフォーム プログラミング言語には、どのようなオプションがありますか?
haskell - レンズを使用して新しい記録を作成することは可能ですか?
レンズを持つレコード タイプがある場合、基になるレコード アクセサーを使用せずに新しいレコードを作成することは可能ですか?
インスタンスを作成してレンズで変更することはできますが、すべてのレコード タイプに適切なデフォルトがあるわけではありません。Control.Lens には独自の方法がありますか?Foo
Data.Default
def
list - レンズを使用してリストの特定の場所に挿入する
要素のリストを含むネストされたデータ構造の操作を実行しようとしています。さまざまなアプローチをいじくり回した後、最終的にこれを行うための最良の方法としてレンズに落ち着きました。それらは、構造の特定の要素を見つけて変更するのに完全に機能しますが、これまでのところ、新しい要素を追加する方法に困惑しています。
私が読んだことから、トラバーサルの法則に違反して新しい要素をリストに挿入するため、トラバーサルを技術的に使用することはできません。これは、最初にトラバーサルを使用してそれを行う方法さえ理解できると仮定しています(私はまだ Haskell にかなり弱く、lens パッケージ内のほとんどのものの型シグネチャには頭が回転します)。
具体的に私が達成しようとしているのは、特定のセレクターに一致する要素のリストでいくつかの要素を見つけ、一致した要素の前または後に新しい要素を挿入することです(前または後の関数への異なる引数)マッチ)。Control.Lens には、私がやろうとしていることを達成できる何かが既にありますか? 型シグネチャについての私の理解は弱すぎてそれを見ることができませんか? 私がやろうとしていることを達成するためのより良い方法はありますか?
リストの最初または最後に新しい要素を追加しようとしているだけなら、かなり簡単ですが、途中の特定の場所に挿入するのは難しい部分です。私が書いたレンズ前のコードのいくつかでは、私が望んでいたことを達成するために折り目を使用しましたが、構造のより深くネストされた部分 (折り目の内側の折り目の内側の折り目など) で危険になり始めていたので、私は Control.Lens に目を向けて、その混乱の一部を解き明かそうとしました。