高度な型システムで遊んでいます。名前付きの種類と、その種類の型を生成するいくつかの型コンストラクターが必要です。
{-# LANGUAGE DataKinds #-}
data Subject = New | Existing
ここで、私が理解しているように、種類Subject
と型のコンストラクター
New
にExisting
名前を付けまし:: Subject
た。これらの型コンストラクターは引数を取りません (私はそれらをファントム型として使用する予定です)。
{-# LANGUAGE EmptyDataDecls #-}
data New
data Existing
今私が書くことができる違いがあります:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE KindSignatures #-}
-- …
data MyConfig :: Subject -> * -> * where
MyConfig
{ mcOneThing :: Path t File
} :: MyConfig k t
これもコンパイルされます。紛らわしいのは、データ型の宣言がデータ型の宣言と区別できないことです。そのため、このコードはSubject
名前付きの種類だけでなくデータ型も生成するように見えSubject
ます (?)。種類、次にNew
およびExisting
は型コンストラクター、または型、およびNew
およびは型Existing
のものの値コンストラクターですSubject
)。「機能すると思われるすべてのものを宣伝する」というこの設計上の決定は得られません。
さて、私の問題は、他のモジュールで使用する型コンストラクターとしてエクスポートできないことNew
ですExisting
。たとえば、次のようなものを宣言します。
foo :: MyConfig New Dir -> …
同時にどこで
foo :: MyConfig Int Dir -> …
種類が悪く、コンパイルされるべきではありません。
これが私がそれらをエクスポートしようとしている方法です:
module MyModule
( New
, Existing
-- …
)
where
私が得るもの:
スコープ型コンストラクターまたはクラス 'New' にありません</p>
スコープ型コンストラクターまたはクラス「既存」にありません</p>
セクション7.9.3のGHCマニュアルで
は、「型とコンストラクタ」を区別するために一重引用符を使用できると書かれている'
ので、試してみました:
module MyModule
( 'New
, 'Existing
-- …
)
where
…しかし、今は解析エラーです。
New
コンストラクターをエクスポートして型を作成するにはどうすればよいExisting
ですか? 最も重要なのは、現在の理解に何か問題がありますか?