問題タブ [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 - 異種リスト内のシングルトン
異種リストを分析する関数を書きたいと思います。議論のために、次のようにしましょう
最終的な目標は、次のようなものを書くことです
analyzeRec
の各タイプと値でインスタンス化された制約の知識を使用する顕著なビットRec
です。このクラスベースのメカニズムは機能しますが、これを何度も行わなければならない場合 (私もそうしています) は、扱いにくく冗長です。
singletons
したがって、代わりにこれを に基づくメカニズムに置き換えたいと思います。代わりに次のような関数を書きたい
しかし、これは明らかに少なくともいくつかの次元で横ばいです。
シングルトン手法を使用して、異種リストに対してそのような関数を記述する「正しい」方法は何ですか? この問題にアプローチするより良い方法はありますか? この種のことを解決するには、何を期待すればよいですか?
(参考までに、これは Serv と呼ばれる実験的な Servant クローン用です。関連するファイルは背景としてServ.Internal.Header.Serialization
あります。タグ付けされたヘッダー値の異種リストを取り込み、それらを実際のペアのリストに入れるServ.Internal.Header
関数を書きたいと思います。 )headerEncode
(ByteString, ByteString)
haskell - HaskellでユニットをエンコードするためにData Kinds + Phantomタイプを使用するには?
以下のコードはコンパイルされるため機能しません。そうすべきではありません(直感的に)。
1) このコードがコンパイルされるのはなぜですか?
isKm $ getMeter 1
2)コンパイル時に「悪い」プログラムが拒否されるように、このプログラムを「修正」するにはどうすればよいですか?
haskell - DataKinds 拡張機能を使用するときに型コンストラクターをエクスポートする方法は?
高度な型システムで遊んでいます。名前付きの種類と、その種類の型を生成するいくつかの型コンストラクターが必要です。
ここで、私が理解しているように、種類Subject
と型のコンストラクター
New
にExisting
名前を付けまし:: Subject
た。これらの型コンストラクターは引数を取りません (私はそれらをファントム型として使用する予定です)。
今私が書くことができる違いがあります:
これもコンパイルされます。紛らわしいのは、データ型の宣言がデータ型の宣言と区別できないことです。そのため、このコードはSubject
名前付きの種類だけでなくデータ型も生成するように見えSubject
ます (?)。種類、次にNew
およびExisting
は型コンストラクター、または型、およびNew
およびは型Existing
のものの値コンストラクターですSubject
)。「機能すると思われるすべてのものを宣伝する」というこの設計上の決定は得られません。
さて、私の問題は、他のモジュールで使用する型コンストラクターとしてエクスポートできないことNew
ですExisting
。たとえば、次のようなものを宣言します。
同時にどこで
種類が悪く、コンパイルされるべきではありません。
これが私がそれらをエクスポートしようとしている方法です:
私が得るもの:
スコープ型コンストラクターまたはクラス 'New' にありません</p>
スコープ型コンストラクターまたはクラス「既存」にありません</p>
セクション7.9.3のGHCマニュアルで
は、「型とコンストラクタ」を区別するために一重引用符を使用できると書かれている'
ので、試してみました:
…しかし、今は解析エラーです。
New
コンストラクターをエクスポートして型を作成するにはどうすればよいExisting
ですか? 最も重要なのは、現在の理解に何か問題がありますか?
haskell - 値が 1 つだけの種類レベルに昇格可能なデータ型
Bool
私は、次のように親切なレベルに昇格できることを理解していBool
ます。True
False
代わりに宣伝したかっ()
たのですが、もちろんこれには 1 つの値しかありません()
。しかし、これはうまくいかないようです:
Bool
andをそのまま使用できると思いますTrue
が、種類レベルに昇格できる 1 つの値の型はありますか?
haskell - Haskell で「種類のクラス」を作成する方法、または型ファミリを使用して型レベルでアドホック ポリモーフィズムを作成する方法
Haskell の型ファミリの機能と、型レベルの計算について研究しています。以下を使用して、型レベルでパラメトリック多態性を取得するのは非常に簡単なようですPolyKinds
。
:kind! Bool == Bool
や:kind! Int == Int
や:kind! Z == Z
のようなことができます:kind! (I Z (S Z)) == (I (S Z) (S (S Z)))
。
type +
ただし、アドホックなポリモーフィックを作成したいと考えています。私が与えたインスタンスに制約されるように。ここでの 2 つのインスタンスは、 kind のNatK
型とkind の型になりますIntK
。
私は最初にそれをパラメトリックにポリモーフィックにしようとしました:
私ができるように、これは機能します:kind! (I (S Z) Z) :+ (I (S Z) Z)
。
しかし、私もできます:kind! Bool :+ Bool
。これは意味がありませんが、単純な型コンストラクターとして使用できます。そのような誤った型を許可しない型ファミリを作成したいと考えています。
この時点で、私は迷っています。type
パラメータ付きの型クラスを試しました。しかし、それはうまくいきませんでした。
それはまだ許します:kind! Add Bool Bool
。
これは、または何らかの「種類のクラス」ConstraintKinds
に制約する必要がある拡張機能と関係がありますか?:+
Add
haskell - Maybe 型の show メソッドのオーバーロード
これは、私が尋ねた以前の質問のフォローアップです。今、オーバーロードされた関数toText
でも処理できるようにメソッドを変更しようとしています。以下は、コンパイルして正常に動作するコードです。ここで、他の型の定義自体を使用するためにオーバーロードしたいと思います。Maybe a
toText
toText
Maybe a
toText
以下のコメントに示されているように、型のtoTextC
定義を更新すると:TTMMaybe
私はこのエラーを受け取ります - このオーバーロードを解決する方法についてのポインタをいただければ幸いです:
更新 1:
コメントの提案に従って、追加の制約を使用して修正しました。ただし、UndecidableInstances
拡張機能をオンにする必要がありました。を使用せずにこれを行うより良い方法はありUndecidableInstances
ますか? おそらく、型レベルの計算を表現するためのある種の型演算子または関数でしょうか?
haskell - パターン シノニムは型レベル リスト内の型を統合できません
タイプレベルのリストを持つ GADT に基づいてパターン シノニムを定義しようとすると、エラーが発生します。
私はそれをこの例に要約することができました:
私に与えます:
これはバグですか、それとも何か間違っていますか?