2011-06-24 7 views
2

と仮定私はタイプ含むモジュールがあります、それは別のモジュールは可能です非抽象タイプを抽象にインポートできますか?

module My where 

data L a = Nil | Cons a (L a) 

モジュールは、パターンマッチングなど 可能にするためにMyの具体的な定義をエクスポートする方法でMyをインポートするClientを言います は抽象的なものです。つまり、のパターンマッチングはタイプチェッカーで禁止されていますか?

答えて

4

はい、あなたはそのコンストラクタのいずれかをインポートせずにタイプをインポートする

import My(L()) 

を行うことができます。このタイプの値を構築する場合(パターンマッチではない場合)は、構築を行うための関数をインポートする必要があります(たとえば、Myからそのような関数をエクスポートするか、そのような関数を持つユーティリティモジュールを作成します)。

編集:あなたは明示的に型チェックエラーを望んでいたことに言及しているので、私はこれは型チェックエラーとNilConsにパターンマッチングを起こさないことを完全にするために指摘し、単に必要がありますスコープエラー。

+2

これは、コンストラクタなしで型をエクスポートするために使用される構文とほぼ同じ構文であり、 'import My(L)'だけでも同じことが行われることに注意してください。 –

+2

...また、何らかの理由で*私は 'import M(T)'が 'import M(T)()'と同じでなければならないので、輸入M(T()) '、GHCが私をかなり強く嫌うという考え。 –

+0

パーフェクト、ありがとうございました! –

6

はい。あなたはコンストラクタをインポートしたいなかった場合は、

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を参照してください(資料にはデータ型とそのコンストラクタのインポートについては記載されていませんが)。

関連する問題