Неспособность контролировать импорт экземпляров является одним из компромиссов, которые делает система классов типов Haskell. Вот пример на гипотетическом диалекте 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
Хлоп! Набор myMap
был создан с правильным instance Ord Foo
, но он комбинируется с картой, созданной с другим , противоречивым экземпляром.
Возможность сделать это нарушит допущение Хаскелла в открытом мире . К сожалению, я не знаю хорошего централизованного ресурса для изучения этого. Этот раздел RWH может быть полезен (я искал "допущение открытого мира в Haskell").