2011-05-21 24 views
22

que tienen este tipo de definición:Haskell: Derivado Mostrar de los tipos personalizados

data Operace = Op (Int->Int->Int) String (Int->Int->Int) deriving Show 

Quiero imprimir este tipo en el intérprete de comandos interactivo (GHCi). Todo lo que se debe imprimir es el campo String.

yo probamos este:

instance Show Operace where 
    show (Op op str inv) = show str 

Pero puedo seguir obteniendo

No instance for (Show (Int -> Int -> Int)) 
    arising from the 'deriving' clause of a data type declaration 
Possible fix: 
    add an instance declaration for (Show (Int -> Int -> Int)) 
    or use a standalone 'deriving instance' declaration, 
     so you can specify the instance context yourself 
When deriving the instance for (Show Operace) 

no quiero añadir Show para (Int->Int->Int), todo lo que quiero imprimir es la cadena.

¡Gracias por la ayuda!

EDIT:

Para referencia futura, la versión fija es:

data Operace = Op (Int->Int->Int) String (Int->Int->Int) 

instance Show Operace where 
    show (Op op str inv) = str 

Respuesta

20

La declaración de instancia ha realizado es la forma correcta de ir. Parece que olvidó eliminar esa cláusula deriving defectuosa de la declaración original data.

data Operace = Op (Int->Int->Int) String (Int->Int->Int) 

instance Show Operace where 
    show (Op op str inv) = show str 
+1

Sí, eso fue todo, gracias. Esperé que funcionara como en los lenguajes tipo C, donde declaras la lista de tipos principales en la definición de la clase. –

+1

@mzabsky: Este es un mecanismo poderoso, ya que puede definir instancias de clases de tipos adicionales para un tipo existente sin tocar su definición. – hammar

19

Puede derivar Show, basta con importar Text.Show.Functions primero.

Cuestiones relacionadas