問題タブ [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 投票する
0 に答える
219 参照

generics - テンプレート haskell を使用せずにレコード データ型を派生させる

それで、私は GHC.Generics を少しいじってみました。これは素晴らしいものですが、主にインスタンスの生成に限定されているように見えます。

可能であれば、別のデータ型から新しいデータ型を派生させたいと考えています。

次のタイプがあるとします。

次のデータ型を「無料で」取得したいと思います。

私が考えた 1 つの可能性は、型ファミリを使用することでしたが、新しいデータは Xpto と同じ種類を取得する必要があります。

私はこれのどれも不可能だと考え始めており、それには正当な理由があると確信しています。

注 1: これは Template Haskell でおそらく実行可能であることを知っています...他の方法があるかどうか疑問に思っています。

0 投票する
0 に答える
84 参照

haskell - GHC.Generics を使用して型定義を復元する

昨日、データ型の表現に関するこの質問に答えようと思い立った。GHC.Generics を使用します。たとえば、次のような例の問題の型定義を回復できます。

派生Genericインスタンス、Modelable(型定義を回復できるもののクラス) のデフォルト インスタンス、ModelableおよびText

上記の型宣言から、undefined :: Artistが の型を持っていると判断できます。Main.Artist

次のような再帰的なデータ構造も攻撃できるように、型を宣言で表しました。

私たちが判断できるのは

私がこれまでに持っているコードは、これらすべてのケースをカバーしています:

https://gist.github.com/Cedev/9857191

タイプアプリケーションでタイプを復元できますか?

現時点では、 と など、2 つの異なる型に適用された型の違いを区別する方法がありませ[Track]String ~ [Char]。のDatatypeインスタンスからはD、外側の型しか復元できません。この場合GHC.Types.[]、2 つの型を区別することさえできません。

次は an のタイプの許容可能な出力ですが、Album非効率的です。

[Track]との違いがわからないので、取得できる最も近いものは次のようなものです。これは、最初に遭遇したものであるため、すべての s が含まれているStringと想定しています。[]Track

宣言で型変数を復元できますか?

さらに優れた表現は、 の定義を共有します[][]これには、に種類* -> *があり、その:コンストラクターの最初の引数の型が型引数から に由来することを発見する必要があります[]

*と以外の種類のものの型定義を復元できます* -> *か?

より多くの引数を持つものの定義を回復することは可能でしょうか?

たとえば、

高次の種類を持つものの定義を回復することは可能でしょうか?

どれだろう

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

haskell - GHC.Generics を使用してジェネリック関数ドメインを制限する

型クラスがあるとします:

の定義fixedは非常に簡単なので、次を使用して導出しGHC.Genericsます。

for void 型GFixed U1のインスタンスを持つ意味がないため、インスタンスの for は含めません。Fixed機械についての私の理解Genericsはあまりよくありません。具体的には、機械の種類M1K1意味についてです。質問は次のとおりです:の既定の定義が再帰型で機能しないGFixedように、型レベルで制限できますか?fixed

たとえば、次のように記述します。

型エラーが発生します: No instance for (GFixed V1). などの型エラーを取得したいと思いinstance Fixed [Int]ます。

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

haskell - Generic インスタンスのすべての値を列挙するときの無限再帰

私の別の答えとして、列挙可能な s の斜めにトラバースされたインスタンスを提供する次のコードを作成しまし UniverseそこGenericのバージョンからわずかに更新されていますが、同じロジックを使用しています):

Omegaおそらく問題とは関係ありませんが、質問の一部でした。)

これは、次のような再帰的なものであっても、ほとんどの型で機能します。

例:

ただし、上記の型はすべて再帰コンストラクターを最初から持っていないことに注意してください。実際(そしてこれが問題です)、次のように分岐します。

の評価順序に何か問題があるのではないかと最初は思ったのですOmegasが、左右を入れ替えてもうまく(2)いくだけで失敗するというのが正しい動作だと思います。T7T6

私の現在の疑いは、universein lineへの呼び出しの(1)評価が早すぎることです。たとえば、次の例も発散しますが、リストには値が1 つだけある必要があり、評価する必要さえありません。

したがって、唯一のインスタンス は、必要ではありませんが、 list 内でT8 (T8 (...) ... )評価されます! この効果がどこから来ているのかわからない - それはそれ自身のインスタンスの再帰的な使用ですか? しかし、なぜ「右再帰」型は正しく動作し、「左再帰」型 ( ) は正しく動作しないのでしょうか?UniverseT6T7

これは厳しさの問題ですか?もしそうなら、コードのどの部分ですか?私のUniverseインスタンス?Generic? そして、それを修正する方法は?それが問題なら、GHC 7.6.3を使用します。

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

haskell - GHC Generics に対する SYB (ボイラープレートの破棄) の利点

GHC Generics と比較して、SYB でしかできないタスク、または SYB ではるかに簡単なタスクはありますか?

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

haskell - ボイラープレートなしで型「T a」から「T b」に変換する

したがって、「注釈」タイプによってパラメーター化された、多数のケースを持つ AST データ型があります。

私は注釈型ST、そしていくつかの機能を持っていますf :: S -> T。Expr 値内で発生するそれぞれの変換を使用してExpr S、 を取得して に変換したいと考えています。Expr TfS

SYB またはジェネリックを使用してこれを行い、すべてのケースでパターン マッチを回避する方法はありますか? こういうのに向いているタイプのようです。私はSYBに精通していないため、具体的な方法を知ることができません。

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

haskell - 最後の型引数ではなく、ファンクター インスタンスを派生させる

今日私が以前に尋ねたこの質問に関連しています。

「注釈」タイプによってパラメーター化された、多数のケースを持つ AST データ型があります。

def と var の具体的なインスタンスがDefありVarます。

私が望むのはfmap、最初の引数でファンクターとして機能するものを自動的に導出することです。次のような関数を導出したいと思います。

normal を使用するfmapと、fmap がその関数を最初ではなく最後の型引数に適用しようとしていることを示すコンパイラ メッセージが表示されます。

定型文をたくさん書かずに、説明されているように関数を派生させる方法はありますか? 私はこれをやってみました:

しかし、次のエラーが表示されます。

私は他の誰かのコード ベースで作業しているので、どこでも型引数の順序を切り替える必要がなければ理想的です。