2016-07-03 5 views
1

私はライブラリプロジェクトを持っていますが、特殊なモノモフィックコンテナはほとんどありません(主にセットとマップのようなもの)。それらはすべて、基本的なSet functioanality(空、シングルトン、挿入、共用など)を共有するだけでなく、付加価値固有の機能も持っています。それらのうちのいくつかはData.Setのラッパーであるが、他のものは有限のビットセットのようなより効率的な実装が必要である。1つのライブラリの複数の単体容器Haskell

  1. ごとにこのような関数(emptyT、singletonU)の接尾辞を付けるの長所と短所は何ですか:私は2つの質問がありますか?単相性のすべてのコンテナ関数を接尾辞付きで区別することは、一般的なプラクティスになりますか?

  2. ここにいくつかのサンプルコードがあります。

    import qualified Data.Set as S 
    
    data T = ... 
    
    newtype TSet = TSet { unpack :: S.Set T } 
    
    emptyT = TSet S.empty 
    
    singletonT = TSet . S.singleton 
    

これは、多型のコンテナを包み込むための正しい方法ですか?機能を "継承"するための巧妙な方法はありますか?カスタムのSet typeclassを作成することを考えましたが、ここでいくつかの記事を読んだ後には、複雑すぎることがわかりました。

答えて

1

単一形特殊化ごとにモジュールを使用することをお勧めします。 モジュール名を検討するData.Set.Specialized.Int,Data.Set.Specialized.Charなど 可能な限り接尾辞なしでData.Setで使用されているのと同じ名前を再利用します。 モジュールをimport qualifiedとして使用する場合は、Data.Setとしてください。

利点:

  • ユーザが例えばから、もう一つは特殊な変異体へのData.Setコードを変更したい場合、これは単にタイプを変更することによってドームである名前
  • に精通しています

    import qualified Data.Set.Specialized.Int as SI 
    foo :: SI.Set -> String 
    

    import qualified Data.Set as S 
    foo :: S.Set Int -> String 
    

    コードに触れることなく。

typeclassも可能ですが、すべてのバリアントの間で共通の操作を選択するように注意する必要があります。また、私が正しく理解していれば、あなたはまだいくつかのセットに他のセットでは利用できない特別な操作を許可したいと思っています。これらはもちろん、架空の型のクラスの外にある。

質問2の場合:ラッピングがnewtypeData.Setの場合、safe coercionsとしてください。

module Data.Set.Specialized.Int where 

import qualified Data.Set as S 
import Data.Coerce 

newtype Set = Set { unSet :: S.Set Int } 

union :: Set -> Set -> Set 
union = coerce S.union 
+0

私はお詫び申し上げます。ライブラリは、標準タイプの特殊なコンテナに関するものではありません。これは、ドメインXに有用なコードを書くためのもので、ドメインXに特化したデータ型T、U、V ...があり、標準ライブラリの文脈では役に立たない。 – lanskey

関連する問題