Явно импортировать экземпляры - PullRequest
32 голосов
/ 04 января 2012

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

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

import Control.Monad.Error ()

для импорта экземпляра монады, который я могу использовать для (Either String). Раньше я пользовался

import Control.Monad.Error

Я не удовлетворен ни одним из них, потому что экземпляр Monad неявно импортируется.

Ответы [ 3 ]

46 голосов
/ 04 января 2012

Неспособность контролировать импорт экземпляров является одним из компромиссов, которые делает система классов типов 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").

7 голосов
/ 04 января 2012

Вы не можете. Экземпляры всегда неявно экспортируются, и, следовательно, вы не можете явно импортировать их. Кстати, экземпляр Either e Monad в настоящее время находится в Control.Monad.Instances.

2 голосов
/ 04 января 2012

Хотя обычно правильным ответом будет «нет, вы не можете», я предлагаю это ужасное решение:

копирование + вставка

Взгляните наисходный код библиотеки для нужного модуля и скопируйте / вставьте необходимые объявления данных, импорт и определения функций в свой собственный код. Не копируйте экземпляры, которые вам не нужны.

В зависимости от рассматриваемой проблемы системные расширения типа ghc OverlappingInstances или IncoherentInstances могутбыть альтернативным решением, хотя это, вероятно, не решит никаких проблем с библиотеками base.

...