2012-10-12 68 views
11

En Haskell, al definir un tipo de datos puede elegir derivar automáticamente algunas instancias, pero ¿puedo diferir la derivación automática, quizás incluso ponerla en otra biblioteca?Derivación de instancia automática después de la declaración

Aquí se muestra un ejemplo: se derivan

automática en Haskell es un verdadero ahorro de tiempo!

module MoneyModule where 

data Money = Money Int 
    deriving Show 

Ahora desea utilizar el MoneyModule, pero también quiero una instancia Read para Money:

module ExternalModule where 

instance Read Money where 
    read = error "Can't this be done automatically instead?" 

Pero realmente hubieran preferido para que se deriva automáticamente, lo que sé GHC podía han hecho si solo el autor de MoneyModule hubiera derivado automáticamente la instancia Read.


sé que:

  • Es mejor para solucionar el problema en el actual MoneyModule remendándolo con la instancia que falta.
  • Que se considera malo tener instancias huérfanas. Las declaraciones de instancia se colocan preferiblemente en el módulo donde se definió la clase de tipo o el tipo de datos .

En mi caso no puedo seguir las mejores prácticas ya que la clase de tipo no está relacionada con el tipo de datos. Dudo que el módulo de clase de tipo ni el módulo de tipo de datos quiera mantener la instancia, por lo tanto, estoy creando una tercera biblioteca porque en algunas aplicaciones necesita la declaración de la instancia.

Respuesta

14

GHC tiene la extensión StandaloneDeriving, con eso, puede

{-# LANGUAGE StandaloneDeriving #-} 
import MoneyModule 

deriving instance Read Money 

derivar casos de muchas clases.

4

Para resolver el problema de la derivación independiente, consulte la solución de daniels. Pero como mencionó en su pregunta, las instancias huérfanas no son las mejores prácticas y ghc generará advertencias. Para suprimir las advertencias huérfanas ghc, puede usar la bandera -fno-warn-orphans. También puede agregarlo a su archivo cabal:

... 
library 
    exposed-modules: ... 
    ... 
    ghc-options: -fno-warn-orphans 
... 
Cuestiones relacionadas