問題タブ [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.
generics - テンプレート haskell を使用せずにレコード データ型を派生させる
それで、私は GHC.Generics を少しいじってみました。これは素晴らしいものですが、主にインスタンスの生成に限定されているように見えます。
可能であれば、別のデータ型から新しいデータ型を派生させたいと考えています。
次のタイプがあるとします。
次のデータ型を「無料で」取得したいと思います。
私が考えた 1 つの可能性は、型ファミリを使用することでしたが、新しいデータは Xpto と同じ種類を取得する必要があります。
私はこれのどれも不可能だと考え始めており、それには正当な理由があると確信しています。
注 1: これは Template Haskell でおそらく実行可能であることを知っています...他の方法があるかどうか疑問に思っています。
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
宣言で型変数を復元できますか?
さらに優れた表現は、 の定義を共有します[]
。[]
これには、に種類* -> *
があり、その:
コンストラクターの最初の引数の型が型引数から に由来することを発見する必要があります[]
。
*
と以外の種類のものの型定義を復元できます* -> *
か?
より多くの引数を持つものの定義を回復することは可能でしょうか?
たとえば、
高次の種類を持つものの定義を回復することは可能でしょうか?
どれだろう
haskell - GHC.Generics を使用してジェネリック関数ドメインを制限する
型クラスがあるとします:
の定義fixed
は非常に簡単なので、次を使用して導出しGHC.Generics
ます。
for void 型GFixed U1
のインスタンスを持つ意味がないため、インスタンスの for は含めません。Fixed
機械についての私の理解Generics
はあまりよくありません。具体的には、機械の種類M1
とK1
意味についてです。質問は次のとおりです:の既定の定義が再帰型で機能しないGFixed
ように、型レベルで制限できますか?fixed
たとえば、次のように記述します。
型エラーが発生します: No instance for (GFixed V1)
. などの型エラーを取得したいと思いinstance Fixed [Int]
ます。
haskell - Generic インスタンスのすべての値を列挙するときの無限再帰
私の別の答えとして、列挙可能な s の斜めにトラバースされたインスタンスを提供する次のコードを作成しました( Universe
そこGeneric
のバージョンからわずかに更新されていますが、同じロジックを使用しています):
(Omega
おそらく問題とは関係ありませんが、質問の一部でした。)
これは、次のような再帰的なものであっても、ほとんどの型で機能します。
例:
ただし、上記の型はすべて再帰コンストラクターを最初から持っていないことに注意してください。実際(そしてこれが問題です)、次のように分岐します。
の評価順序に何か問題があるのではないかと最初は思ったのですOmegas
が、左右を入れ替えてもうまく(2)
いくだけで失敗するというのが正しい動作だと思います。T7
T6
私の現在の疑いは、universe
in lineへの呼び出しの(1)
評価が早すぎることです。たとえば、次の例も発散しますが、リストには値が1 つだけある必要があり、評価する必要さえありません。
したがって、唯一のインスタンス は、必要ではありませんが、 list 内でT8 (T8 (...) ... )
評価されます! この効果がどこから来ているのかわからない - それはそれ自身のインスタンスの再帰的な使用ですか? しかし、なぜ「右再帰」型は正しく動作し、「左再帰」型 ( ) は正しく動作しないのでしょうか?Universe
T6
T7
これは厳しさの問題ですか?もしそうなら、コードのどの部分ですか?私のUniverse
インスタンス?Generic
? そして、それを修正する方法は?それが問題なら、GHC 7.6.3を使用します。
haskell - GHC Generics に対する SYB (ボイラープレートの破棄) の利点
GHC Generics と比較して、SYB でしかできないタスク、または SYB ではるかに簡単なタスクはありますか?
haskell - ボイラープレートなしで型「T a」から「T b」に変換する
したがって、「注釈」タイプによってパラメーター化された、多数のケースを持つ AST データ型があります。
私は注釈型S
とT
、そしていくつかの機能を持っていますf :: S -> T
。Expr 値内で発生するそれぞれの変換を使用してExpr S
、 を取得して に変換したいと考えています。Expr T
f
S
SYB またはジェネリックを使用してこれを行い、すべてのケースでパターン マッチを回避する方法はありますか? こういうのに向いているタイプのようです。私はSYBに精通していないため、具体的な方法を知ることができません。
haskell - 最後の型引数ではなく、ファンクター インスタンスを派生させる
今日私が以前に尋ねたこの質問に関連しています。
「注釈」タイプによってパラメーター化された、多数のケースを持つ AST データ型があります。
def と var の具体的なインスタンスがDef
ありVar
ます。
私が望むのはfmap
、最初の引数でファンクターとして機能するものを自動的に導出することです。次のような関数を導出したいと思います。
normal を使用するfmap
と、fmap がその関数を最初ではなく最後の型引数に適用しようとしていることを示すコンパイラ メッセージが表示されます。
定型文をたくさん書かずに、説明されているように関数を派生させる方法はありますか? 私はこれをやってみました:
しかし、次のエラーが表示されます。
私は他の誰かのコード ベースで作業しているので、どこでも型引数の順序を切り替える必要がなければ理想的です。