問題タブ [haskell-lens]
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 - レンズのリストを生成するには?
オブジェクトのリストがあるコードに共通のパターンがあり、それらを関数に渡してchoose
ユーザーに選択させます。
ただし、選択した要素にアクセスするにはパーシャルを使用する必要があるため、 を返すのInt
は残念です。(!!)
これを避けるために、私は
ここで、リストの各要素にアクセスするためのレンズのリストを渡します。そうすれば、実際に存在するかどうかを気にせずに、レンズの反対側にあるオブジェクトを変更しても安全だと確信できます。
このようなレンズのリストを作成するにはどうすればよいですか? 効果的に、私は必要です
おまけとして、より一般的なもの
トラバーサルがアクセスする各ポイントのレンズを作成することも素晴らしいでしょう
haskell - Control.Lens からいくつかの Getter を使用して関数を呼び出すクリーンな方法は何ですか。
レンズが定義されたデータ構造があるとします。たとえば、次のようになります。
そして、いくつかのゲッターを使用して呼び出したい関数があるとします。たとえば、次のようになります。
現時点では、各フィールドにアクセスするためにかっこを使用すると、多くの醜さが生じます。次に例を示します。
他のほとんどの状況でのライブラリの簡潔さを考えると、lens
もう少しエレガントなものを望んでいましたが、この特定のケースに役立つコンビネータが見つかりません。
haskell - Haskell のレンズにおけるセッターとゲッターの型の違い
私は、data type
G
フィールドを持っている を持っています_repr :: Data.Graph.Inductive.Gr String String
。Gr
通常、新しいノードをグラフに追加するときLNode a
は、基本的に のタプルとして定義されるオブジェクトを提供する必要があります(Int, a)
。ここで、Int はグラフのノード インデックスです。以下の関数の例を参照してくださいadd
。
インデックスを自動的に計算する関数を実装したいと思いaddx
ます(たとえば、Data.Graph.Inductive.newNodes
関数を使用して)。addx
の署名が必要で、addx :: String -> G -> Int
この関数は新しいフリー インデックスを計算し、グラフ G を変更して、この計算されたインデックスを返します。G
レンズなどを使用して、Haskellでそのような関数(この場合は既存のオブジェクトを変更します)を作成することは可能ですか?
Haskell lens は次のように定義されておりlens :: (a -> c) -> (a -> d -> b) -> Lens a b c d
、lens は基本的に「ゲッター」と「セッター」であるため、その署名により、さまざまなタイプのゲッター出力 ( c
)、セッター値 ( d
)、およびセッター出力 ( b
) が許可されることがわかりました。
haskell - 存在型でレンズを使用できないことを回避するにはどうすればよいですか?
私は Edward Kmett のレンズライブラリを初めて使用しています。
[1] の質問は、存在量指定子が makeLenses を妨害することを説明しています。私はむしろ、何らかの形でレンズを使って実存的なものを使いたいと思っています.
背景として、私はクラスを持っています:
実際の質問については、次のタイプが必要です。
そして、私は次の行に沿って何かを書きたいと思っています:
[1] で説明した理由により、これは機能しません。でコンパイルして GHC にデバッグ情報を求めると-ddump-splices
、次のようになります。
スプライス自体は空白です。これは、スプライスによって宣言が生成されないことを示しています。[1] を読んだ今、この部分を期待し、理解しています。
私が知りたいのは、これを行う方法です-問題を回避するにはどうすればよいですか? これで上流に泳がないようにするにはどうすればよいですか? 合成レンズのパスを介して構造の任意の部分にアクセスできるようにしたいのですが、 などのタイプの他のタイプのフィールドがあるため、レンズSet AnyFile
で のコンテンツにアクセスできない限りアクセスできませんAnyFile
。
haskell - GHCi のレコードからレンズを作成するにはどうすればよいですか?
Lens
図書館でちょっと遊んでみたい。それを GHCi にロードし、適切なアンダースコアを使用してレコード データ型を作成しました。
テンプレートをFoo
使用するためのレンズを作りたいです。Template-Haskell docsmakeLenses
のセット全体を読む必要なく、これを行いたいと思います。
これを機能させるには、GHCi プロンプトでどのような呪文を入力すればよいですか?
haskell - Haskell の Lens ライブラリの `ix` と `at` の違いは何ですか
私が知っているのは、一方が機能し、もう一方が機能しないということだけです。
コンテキスト:別のデータ構造へのF
を含む
1 つのデータ構造があります。私の目標は、与えられたとのフィールドを記述するを構築することでした。Data.Map.Map k S
S
Lens
F
k
S
問題は、キーk
がマップに存在しない可能性があることです。関数がその戻り値を Maybe でラップできることは問題ありません。ただし、を使用して Maybe を介してレンズを伝播できませんでしたat
。多くのスタック オーバーフローの回答を読んだ後、私はこれに出くわしました。
に置き換えるat
とix
、型の問題が解決したことがわかりまし(^.)
た(^?)
。
Question:
It seems like at
and ix
do the same thing, at least with regard to Map
. Both take a key and give a 'Lens' to the value at that key. However, ix
seems to play nice with the function composition operator (.)
. What is the difference between the two?
Off Topic Rant:
I like infix operators as much as the next guy but the Control.Lens package seems to have gone a little overboard. For a new user having some English names and a key somewhere would lower the learning curve. Due to the huge number of wrapper classes used in the Lens library it is particularly difficult to dig through the type signatures if you don't already know what is going on. My code is starting to look like Perl for heaven sake.
haskell - Lens の欠落している State Combinator を検索しています
現在、次のようなコードがあります。
foo
aLens
はFoo
フィールドに、runFoo :: MonadState m => Foo -> m Foo
この操作を1行で行う方法があるはずだと思いますが、見つかりません。次のようなコメントが必要だと思います。
質問:
- そのようなコンビネータは存在しますか?もしそうなら、それは何ですか?
- このような別の質問に出くわしたとき、それを検索する最善の方法は何ですか (つまり、通常はこれを Hoogle に入力するだけですが、レンズ ライブラリでそれを行うのはうまくいきませんでした)。
- これは実際には Control.Monad にあるプリミティブ コンビネータですか? (これがクライスリの矢のまた別の仕事だったらちょっと恥ずかしい)
list - Haskell リストと Control.Lens
単純な「動的型付け」言語用の AST ライブラリを作成しています。構文ツリーとパーサーを作成しました。現在、私は AST の操作に取り組んでおり、その目的で lens パッケージを使用することに興味があります。
検討
オブジェクト フィールドを操作するレンズを非常に簡単に作成できます。
しかし、Arr 要素を操作するためにどこから始めればよいかわかりません。次のようなレンズが欲しいです:
便宜上、Obj 表現を変更しますが、レンズを使用してリストにインデックスを付ける方法を知っておくと役立ちます。