と仮定私はタイプ含むモジュールがあります、それは別のモジュールは可能です非抽象タイプを抽象にインポートできますか?
module My where
data L a = Nil | Cons a (L a)
モジュールは、パターンマッチングなど 可能にするためにMy
の具体的な定義をエクスポートする方法でMy
をインポートするClient
を言います は抽象的なものです。つまり、のパターンマッチングはタイプチェッカーで禁止されていますか?
と仮定私はタイプ含むモジュールがあります、それは別のモジュールは可能です非抽象タイプを抽象にインポートできますか?
module My where
data L a = Nil | Cons a (L a)
モジュールは、パターンマッチングなど 可能にするためにMy
の具体的な定義をエクスポートする方法でMy
をインポートするClient
を言います は抽象的なものです。つまり、のパターンマッチングはタイプチェッカーで禁止されていますか?
はい、あなたはそのコンストラクタのいずれかをインポートせずにタイプをインポートする
import My(L())
を行うことができます。このタイプの値を構築する場合(パターンマッチではない場合)は、構築を行うための関数をインポートする必要があります(たとえば、My
からそのような関数をエクスポートするか、そのような関数を持つユーティリティモジュールを作成します)。
編集:あなたは明示的に型チェックエラーを望んでいたことに言及しているので、私はこれは型チェックエラーとNil
とCons
にパターンマッチングを起こさないことを完全にするために指摘し、単に必要がありますスコープエラー。
はい。あなたはコンストラクタをインポートしたいなかった場合は、
Client.hs:8:10: Not in scope: data constructor `Cons'
Client.hs:8:17: Not in scope: data constructor `Nil'
Client.hs:11:10: Not in scope: data constructor `Cons'
Client.hs:12:9: Not in scope: data constructor `Nil'
あなたはでしょう:あなただけのインポートリストを使用する必要があります:あなたはこれをコンパイルしようとした場合
module Client where
import My (L)
ok :: L Int
ok = undefined
bad :: L Int
bad = Cons 3 Nil
bad2 :: L Int -> Int
bad2 (Cons i _) = i
bad2 Nil = 0
を、あなたは、次の4つのエラーを取得します代わりにL(..)
、またはを入力してCons
をインポートしますが、Nil
はインポートしないでください。
import
ステートメントを使用できるその他の方法については、the HaskellWiki article on import
を参照してください(資料にはデータ型とそのコンストラクタのインポートについては記載されていませんが)。
これは、コンストラクタなしで型をエクスポートするために使用される構文とほぼ同じ構文であり、 'import My(L)'だけでも同じことが行われることに注意してください。 –
...また、何らかの理由で*私は 'import M(T)'が 'import M(T)()'と同じでなければならないので、輸入M(T()) '、GHCが私をかなり強く嫌うという考え。 –
パーフェクト、ありがとうございました! –