問題タブ [ghc-generics]

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

haskell - 型ファミリーを含むジェネリック トラバーサルを派生させる方法

アプリケーションを構成するとき、多くの場合、そのフィールドを定義する方法は、フィールドを使用する方法と同じです。

また、異なる場合もあります。これを型クラスで正式にしましょう:

典型的なサービス構成には多くのフィールドがあり、各カテゴリにいくつかあります。一緒に構成する小さなコンポーネントをパラメーター化すると、大きな複合レコードを 2 回ではなく 1 回 (構成仕様用に 1 回、実行時データ用に 1 回) 書き込むことができます。これは、「Trees that Grow」という論文の考え方に似ています。

UiServerConfigは、構成したい多くのサービスの 1 つなので、そのようなレコード タイプを派生させ、クラスにデフォルトの実装をGeneric追加するとよいでしょう。ここで行き詰まります。toRunTimeConfig

のようにパラメータ化された型が与えられた場合、すべてのレコード フィールドに (再帰的に)影響するdata Foo f = Foo { foo :: TypeFn f Int, bar :: String}ような任意の型のトラバーサルを一般的に導出するにはどうすればよいですか?FooTypeFn

私の混乱の一例として、私はジェネリック SOP を次のように使用しようとしました。

これは が原因xs :: [[*]]で失敗しますConfigが、kind の型引数を取りますa :: ConfigPhase -> *

もつれを解くために何を読むべきかについてのヒントは本当にありがたいです. 完全なソリューションも受け入れられます:)