5

高度な型システムで遊んでいます。名前付きの種類と、その種類の型を生成するいくつかの型コンストラクターが必要です。

{-# LANGUAGE DataKinds #-}

data Subject = New | Existing

ここで、私が理解しているように、種類Subjectと型のコンストラクター NewExisting名前を付けまし:: 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ですか? 最も重要なのは、現在の理解に何か問題がありますか?

4

1 に答える 1

5

コンストラクターをエクスポートするには、通常の構文を使用します。

module MyModule (Subject(..)) where

data Subject = New | Existing

現在、持ち上げられたコンストラクターと持ち上げられていないコンストラクターは結び付けられているため、それらをまとめてエクスポート/インポートすることしかできません。

また、リフトされたコンストラクターを使用する予定のモジュールでのみ、 inDataKindsを持つ必要はありません。MyModule

于 2016-01-05T11:13:43.523 に答える