インスタンスのインポートを制御できないことは、Haskellのtypeclassシステムが行うトレードオフの1つです。ここでは仮想的なHaskellの方言の例だところ、次のことができます。
Foo.hs:
module Foo where
data Foo = FooA | FooB deriving (Eq, Ord)
Bar.hs:
module Bar (myMap) where
import Data.Map (Map)
import qualified Data.Map as Map
import Foo
myMap :: Map Foo Int
myMap = Map.singleton FooA 42
Baz.hs:
module Baz where
import Data.Map (Map)
import qualified Data.Map as Map
import Foo hiding (instance Ord Foo)
import Bar (myMap)
instance Ord Foo where
FooA > FooB = True
FooB > FooA = False
ouch :: Map Foo Int
ouch = Map.insert FooB 42 myMap
Yikes!セットmyMap
は適切なinstance Ord Foo
で作成されましたが、相違すると異なるで作成されたマップと組み合わせられています。
これを行うことができれば、Haskellのオープンワールドの仮定に違反します。残念ながら、私はそれについて学ぶための良い、中央集権的なリソースを知らない。このsection of RWHが役に立つかもしれません(私は "haskell open world assumption"を検索しました)。
マップ、セットではありません。良い例、+1。 –
@DanielFischer:固定、ありがとう:) – ehird
そのパスに行きたい場合は、マップがそのOrd辞書を持ち運びできるように、インスタンスをファーストクラスにする必要があります。 –