Явно импортировать экземпляры
Как явно импортировать экземпляры классов типов? Кроме того, как мне сделать это с квалифицированным импортом?
В настоящее время я делаю
import Control.Monad.Error ()
импортировать экземпляр монады, который я могу использовать для (Either String)
, Раньше я пользовалась
import Control.Monad.Error
Я не удовлетворен ни одним из них, потому что Monad
Экземпляр неявно импортируется.
3 ответа
Неспособность контролировать импорт экземпляров является одним из компромиссов, которые делает система классов типов 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 ").
Ты не можешь Экземпляры всегда неявно экспортируются, и, следовательно, вы не можете явно импортировать их. Кстати, Either e
"s Monad
Экземпляр в настоящее время в Control.Monad.Instances
,
Хотя обычно правильный ответ будет "нет, вы не можете", я предлагаю это ужасное решение:
копировать + вставить
Взгляните на исходный код библиотеки для нужного модуля и скопируйте / вставьте необходимые декларации данных, импорт и определения функций в свой собственный код. Не копируйте экземпляры, которые вам не нужны.
В зависимости от проблемы, системные расширения GHC OverlappingInstances
или же IncoherentInstances
может быть альтернативным решением, хотя это, вероятно, не решит никаких проблем с base
библиотеки.