2012-01-28 7 views
10

私は通常、特定の識別子がどこに来たかを一目で知ることができますので、ほとんどの言語で名前空間(修飾モジュール名)を使用していますから。ハスケルでは、Prelude関数との共通名の衝突を避けるという追加の利点もあります。修飾名で醜いインフィックスシンボルを扱うにはどうすればいいですか

しかし、私は中置シンボル(または他の短い、DSL-Yの識別子)に名前空間を置くために持っているような感じはこのように、私は値を再輸出するように誘惑しています本当に奇妙に見える:

import qualified Data.Sequence as Seq 
(|>) = (Seq.|>) 
(<|) = (Seq.<|) 

何今私は盗聴しています。

  • 手動で値を再輸出すると退屈な定型文句が感じられます。

  • は手動で値を再輸出することは私がどのように

    import qualified Data.Sequence as Seq 
    (:>) = (Seq.:>) --gives me a parse error: 
           --"Not in scope: data constructor `:>'" 
    

(私はまだ遭遇しませんでしたし、おそらく他のもの)は、既存のモジュールシステムを一周し、データコンストラクタで動作していないようです中置記号と名前空間を調和させるか?私はあきらめてすべての名前空間を覚えるべきですか?名前空間とシンボルに関するハスケルのベストプラクティスを検証していますか?

import Data.Sequence ((|>), (<|), ViewR ((:>))) 
import qualified Data.Sequence as Seq 

これは、資格のある他のすべてを残し、唯一:>|><|修飾されていないをインポートします:

答えて

19

はまあ、あなたが行うことができます一つのことは二度それをインポートしています。 :>はデータコンストラクタであるため、そのデータ型(ViewR)をインポートする必要がありますが、ではなく、は残りのViewRのコンストラクタをインポートする必要があります。

import Prelude hiding ((.)) 

あなたはまともなライブラリを使用している場合は、前奏曲との競合がライブラリ関数をするように設計されて意味:あなたは競合を心配している場合

また、あなただけのような適切なオペレータを非表示にしますPrelude関数(例えばControl.Category)をに置き換えて、デフォルトの意味に置き換えます。

ベストプラクティスが行われる限り、紛争やGHCiに参加していない限り、資格のある通信事業者は誰も使用していません。オペレーターがどこにいるのかを知るという利点を考慮しても、コードを読みにくくすることができます。

8

私は、一般的に修飾されていないタイプ名、コンストラクタと演算子をインポートし、資格を他のすべて:

import Data.Sequence (Seq, ViewL(..), ViewR(..), (|>), (<|)) 
import qualified Data.Sequence as Seq 

この二重のインポート、非修飾型名のスタイルがData.Mapにドキュメントや他の標準のコンテナによって推奨されます。

それでも、あなたは常に修飾されていない事業​​者をインポートすることはできません - あなたは、同じモジュールにArray/VectorMapを使用している場合たとえば、あなたが修飾されていないの両方から(!)をインポートすることはできません。その場合、私は通常、それを認定して使用します。それは奇妙に見えますが、他のオプションよりも優れています(クラッシュを避けるために自分の名前をつけるなど)。もちろん、恐らくこれは、安全でない関数、例えば(Data.Map.!)を使用している人々を止めればよいでしょう。

+0

私がこれを試してみると、コンパイル時に次のエラーが発生します: 'what 'が冗長です。あなたもこれを手に入れますか?警告を取り除くことは可能ですか? – VF1

関連する問題