Importación explícita de instancias

¿Cómo importo explícitamente instancias de clase de tipo? Además, ¿cómo hago esto con una importación calificada?

Actualmente, estoy haciendo

import Control.Monad.Error () 

para importar la instancia de mónada que puedo usar para (Either String) . Anteriormente, utilicé

 import Control.Monad.Error 

No estoy satisfecho con ninguno de los dos, porque la instancia de Monad se importa implícitamente.

La incapacidad de controlar las importaciones de instancias es una de las compensaciones que hace el sistema de clase de tipo Haskell. Aquí hay un ejemplo en un hipotético dialecto Haskell donde puedes:

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 

¡Ay! El conjunto myMap se creó con la instance Ord Foo adecuada instance Ord Foo , pero se está combinando con un mapa creado con una instancia diferente y contradictoria.

Ser capaz de hacer esto violaría la suposición del mundo abierto de Haskell. Desafortunadamente, no conozco un buen recurso centralizado para aprender sobre él. Esta sección de RWH podría ser útil (busqué “la suposición del mundo abierto de Haskell”).

No puedes. Las instancias siempre se exportan implícitamente y, por lo tanto, no puede importarlas explícitamente. Por cierto, la instancia de Monad Either e está hoy en Control.Monad.Instances .

Aunque la respuesta generalmente correcta sería “no, no se puede”, sugiero esta solución horrenda:

copiar + pegar

Eche un vistazo al código fuente de la biblioteca para el módulo deseado y copie / pegue las declaraciones de datos, importaciones y definiciones de funciones necesarias en su propio código. No copie las instancias que no desea.

Dependiendo del problema en cuestión, las extensiones del sistema tipo ghc OverlappingInstances o IncoherentInstances pueden ser una solución alternativa, aunque probablemente esto no resuelva ningún problema con las bibliotecas base .