問題タブ [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 - Haskell: レンズ、lens-aeson、ネストされた JSON で FromJSON インスタンスを再利用する
私は Aeson とレンズ パッケージ (lens-aeson、コア レンズ パッケージから移行) で遊んでおり、それらを連携させるのに苦労しています。
おもちゃの例として、次のタイプがあります。
および FromJSON インスタンス:
ここまでは順調ですね。
ここで、ネストされた JSON データが入ってきて、これだけを抽出したいとします。
残りは気にしません。この「色」の値だけです。さらに悪いことに、JSON は特に一貫性がないとしましょう。
その他の時間
できるだけ簡単に色の値を取得し、理想的には FromJSON インスタンスを使用して色に解析できるようにしたいと考えています。これはおもちゃの例ですが、Color の代わりにデータ型に多数のフィールドなどがある場合があります。
私はレンズ-aesonのものを見始めました、そしてそれは私の希望を上げました。これにより、JSON 構造への非常に簡単なピアリングが可能になります。例:
しかし、 parseJSON 呼び出しでそれを実行して元に戻す方法が見つかりませんJust Yellow
。parseJSON は、適切な型 (おそらく少なくとも内部のもの) を取るという点で近いように見えますが、その後バラバラになります。理想的には、次のいずれかのようなことができます。
私がそれを理解するのに最も近いのは、上記の結果を再エンコードしてからデコードすることです。
これにより、必要な JSON エンコード データが返されます。より複雑なケースでは、そのデータがオブジェクトまたは配列である場合、decode
通常どおりに実行してより複雑な型を取得できますが、decode は不適切な JSON を好みません。配列またはオブジェクト構文にラップされていないもの。さらに、デコードしてからエンコードするのは非常に面倒で、あまりパフォーマンスが良くないように見えます。
私はレンズと Aeson 全体にかなり慣れていません (そして Haskell については、全体としてモナド/アプリケーションのようなものを理解するようになったので、ゆっくりと進歩しています!)。皆さんはどうやってこれを成し遂げますか?
私の一般的な動機は、JSON データの負荷を処理することですが、実際にはその断片のみを気にするため、JSON のさまざまな場所からそれらの断片を取得する必要があるたびにデータ型を宣言することを避けたいということです。代わりに、気になるビットの型を宣言するだけです。
少し異なる動作をする aeson-lens ではなく、lens-aeson-1 と lens-4.4.0.1 を使用していることに注意してください (回答に関連する可能性があります)。
前もって感謝します!ジェームズ
haskell - makeLenses と makeFields の違いは何ですか?
かなり自明です。型クラスを作成する必要があることは知っていmakeClassy
ますが、2つの間に違いはありません。
PS。両方のデフォルトの動作を説明するためのボーナスポイント。
haskell - モジュール間でレンズ フィールド定義を共有する慣用的な方法
レコードからフィールドを生成するために両方ともControl.Lens.TH
'を使用する 2 つのモジュールmakeFields
があり、異なるモジュールのそれぞれのレコードが同じフィールド名を持つ場合、2 つのモジュールがname
レンズとレンズの同じ定義を使用していることを確認する最善の方法は何ですか?モジュールのHasName
1つが他のモジュールに依存していないクラス?
現時点では、SharedFields
共有が必要なすべてのフィールドを持つ単一のレコードで名前が付けられた別のモジュールを使用してから、SharedFields
生成された TH フィールドが必要な他のモジュールにモジュールをインポートしていますが、これは扱いにくく、エラーが発生しやすくなっています。
haskell - レンズ ライブラリを使用して、インデックスによってリストからアイテムを削除する方法は?
たとえば、次のようなレンズを使用してリストの 4 番目の項目を表示できます。
リストから 4 番目の項目を表示する代わりに削除するために、「プレビュー」を置き換えることができるものはありますか? 返されるリストは元のリストと同じである必要があり、4 番目の項目が削除されます。
あるいは、filtered 関数を使用してこれを行う方法があるかもしれません。
haskell - .~ のモナディックバージョン (Haskell)
.~
モナドにラップされた値を取り、モナドを返すバージョンを探しています。例えば:
(0, 1) & _1 .~ 100 = (100,1)
仮説.~~
は次のようになります。
(0, 1) & _1 .~~ return 100 = return (100,1)
定義するのは難しくありませんが、Lens パッケージのどこかで既に定義されていますか?
haskell - トラバーサルの融合
The Traversable Paperの 18 ~ 19 ページに、単項トラバーサルと単項トラバーサルの融合の例が示されています。これは非常に興味深いように聞こえますが、それらの LaTex に戸惑っています。
次のような驚くべき結果が得られました。
以下と同じです:
その結果のタイプは次のとおりだと思います。
しかし、100%確かではありません。Haskell で絵文字がどのように表示されるか教えてください。
アップデート
xInACircle は infix かもしれないと思いますsequenceA
。種類がそろっています。または(,)
、どれが のインスタンスであるかだけかもしれませんTraversable
。<*>
結果は少し似ていますが、論文ではt (x <*> y) = t x <*> t y
Wingding を使用していません。<*>
更新 2
xInACircle の型は (Functor m, Functor n) ⇒ (a → mb) → (a → nb) → (a → (m XInASquare n) b) です。何か思い出しますか?私じゃない。