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