Явно импортировать экземпляры

Как явным образом импортировать экземпляры 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.