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

Как явно импортировать экземпляры классов типов? Кроме того, как мне сделать это с квалифицированным импортом?

В настоящее время я делаю

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 библиотеки.

Другие вопросы по тегам