import data list haskell
Importación explícita de instancias (3)
¿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.
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
.
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
.