問題タブ [data-kinds]
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 - より高い種類の関数?
次のデータ型が定義されているとします。
getX
、getY
、およびの 3 つの別個の関数が存在する必要がありますgetZ
か? 次のように定義された関数が存在する可能性があるように私には思えます。
明らかに、これは有効な標準 Haskell ではありませんが、GHC には非常に多くの拡張機能があり、解決策があるようです ( RankNTypes
、ExistentialQuantification
、DataKinds
など)。少量のタイピングを回避するという単純な理由に加えて、レコード ソリューションによって作成される名前空間の汚染を回避するという利点があります。これは、次のような型クラスを使用するよりも、実際にはより暗黙的な解決策であると思います。
ただし、ジェネリック関数を定義する方が型クラスよりも有用であるように思われます。これは、暗黙的に定義されているという事実は、($)
or(.)
が使用されるのと同じ方法で、より多くの場所で使用できることを意味するためです。したがって、私の質問には 3 つの部分があります。これを達成する方法はありますか、それは良い考えですか、そうでない場合、より良い方法は何ですか?
haskell - 種類の降格 (種類の昇格とは対照的に)
DataKinds拡張機能は、「値」(つまりコンストラクター) を型に昇格させます。たとえば、True
andFalse
は kind の異なる型になりますBool
。
私がやりたいことは反対です。つまり、型を値に降格させます。このシグネチャを持つ関数は問題ありません。
たとえば、次のように実際にこれを行うことができますBool
。
ただし、その値に降格したい型のインスタンスを作成する必要があります。ボイラープレートがそれほど多くない、これを行うためのより良い方法はありますか?
haskell - データ型のすべての値でインスタンス化された型クラス
クラス制約が暗示されるように、データカインドのすべてのメンバーが型クラスを満たすように指定することは可能ですか? 例えば
基本的a
に は であるAB
ため、 for のインスタンスがあると確信してFoo
います。ありそうにないと思いますが、どこでFoo
辞書を入手するのでしょうか? -- しかし、私は私の日にいくつかの魔法を見てきました.
haskell - HList のこの定義を理解する
私は Haskell に比較的慣れていないので、 HListの定義の 1 つを理解しようとしています。
具体的な質問がいくつかあります。
'[]
私が見ているとの(x ': xs)
構文は何ですか? 可変引数型パラメーターのパターン マッチングのように見えますが、この構文を見たことがなく、Haskell の可変引数型パラメーターに精通していません。これはGHC の Type Families の一部だと思いますが、リンクされたページにはこれについて何も表示されず、Google で構文を検索するのはかなり困難です。のボクシングを避ける以外に、(2 つのフィールド
newtype
を持つ宣言の代わりに) タプルを持つ宣言を使用する意味はありますか?data
HCons1
haskell - DataKinds を使用した FromJSON インスタンス
TypeLits を使用してデータ型の JSON デシリアライズを実行しようとすると、次の問題が発生します。
次の例で、 FromJSONインスタンスで一般的にNatを許可する正しい構文はどのようになるでしょうか。
haskell - DataKinds を使用する場合、GHCI で型シグネチャを指定できません
そのため、 を使用しているときにポリモーフィックな戻り値の型を特定しようとすると、ghci は興味深いエラーを表示しますDataKinds
。次のコードがあります。
このコードは期待どおりにコンパイルされます。ghci で構築SomeData
し、型を指定しないと、正常に動作します。
しかし、タイプを指定しようとするとエラーになります:
引用符が ghci によって解釈されていないようです。を使用してreplを開始しましたstack ghci
。誰もこれに遭遇したことがありますか?助けてくれてありがとう。
haskell - kind :: '[SomeDataKind] で再帰的な GADT を処理する方法
これは、Haskell の型システムの拡張に最も深く関わっていると思いますが、理解できないエラーに遭遇しました。長さについて前もってお詫び申し上げます。これは、私が抱えている問題を説明するために作成できる最も短い例です。次のような昇格されたリストである再帰的 GADT があります。
GADTの定義
問題
私がやろうとしているのは、データをトラバースしていくつかの操作を実行することです。たとえば、最初Just
Char
に見つかったものを一番上に伝播します。
不足している厄介な機能 - 次のセクションで必要
さて、明らかに GADT ( https://ghc.haskell.org/trac/ghc/ticket/2595 ) のレコード構文サポートがないため、手動で記述する必要があります。
テストデータ
だから、私がやりたいこと。という値が見つかるまで、構造を上から下に歩いていきますJust
。したがって、次の初期値が与えられます。
期待される結果
私はこのようなものが欲しいです:
以前の試み
最初に通常の関数を使用して、いくつか試してみました。
これにより、次のエラーが発生します。
また、型クラスを試し、構造を一致させようとしました:
これにより、次のエラーが発生します。
SomeData '[]
また、マッチングの組み合わせを試してみましたがSomeData '[p]
、役に立ちませんでした。
単純なものが欠けていることを願っていますが、このような構造を処理する方法に関するドキュメントはどこにも見つかりませんでした.Haskell型システムであるかどうかを理解するのは今のところ限界です:)。繰り返しますが、長い投稿で申し訳ありません。どんな助けでも大歓迎です:)