2010-12-11 19 views
20

Estoy intentando agregar una declaración de instancia en Haskell para un nuevo tipo de datos que he creado sin éxito. Aquí lo que he probado hasta ahora:Haskell: Nueva declaración de instancia para Mostrar

data Prediction = Prediction Int Int Int 
showPrediction :: Prediction -> String 
showPrediction (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c 
instance Show (Prediction p) => showPrediction p 

parece que la última línea está mal, pero no estoy seguro de cómo lograr lo que quiero. Básicamente es poder llamar desde el intérprete una variable de Predicción y hacer que se visualice sin tener que llamar al showPrediction. En este momento esto funciona:

showPrediction (Prediction 1 2 3) 

y muestra:

"1-2-3" 

como se esperaba, pero me gustaría que esto funcione (del intérprete):

Prediction 1 2 3 

¿Alguna idea?

Respuesta

44

para derivar un ejemplo, la sintaxis es

instance «preconditions» => Class «type» where 
    «method» = «definition» 

Así que aquí, por ejemplo, tendría

instance Show Prediction where 
    show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c 

No hay precondición; lo usaría para algo como instance Show a => Show [a] where ..., que dice que sia es visible, entonces también lo es [a]. Aquí, todos los Predictions son visibles, por lo que no hay nada de qué preocuparse. Cuando escribiste instance Show (Prediction p) => showPrediction p, cometiste algunos errores. Primero, Prediction p implica que Prediction es un tipo parametrizado (uno declarado por, por ejemplo, data Prediction a = Prediction a a a), que no lo es. En segundo lugar, Show (Prediction p) => implica que siPrediction P es visible, luego desea declarar alguna otra instancia. Y tercero, después del =>, tener una función no tiene sentido: Haskell quería un nombre de clase de tipo.

Además, por el bien de la integridad, hay otra manera de obtener Show si desea que el formato de Prediction 1 2 3 de salida visualizada:

data Prediction = Prediction Int Int Int deriving Show 

As specified in the Haskell 98 report, sólo hay un puñado de tipos que se puede derivar de esta manera: Eq , Ord, Enum, Bounded, Show y Read.Con the appropriate GHC extensions, también puede derivar Data, Typeable, Functor, Foldable y Traversable; puede derivar cualquier clase derivada de newtype para un newtype; y puede generar estas instancias automáticas de forma independiente.

+0

++ alta calidad, profundidad, respuesta integral. – delnan

+0

¡Gracias por la agradable respuesta también! El "Deriving Show" funcionó perfectamente también. Bueno saber ;)) –

10

Tiene la sintaxis incorrecta para las instancias. Para crear una instancia de Show escritura:

instance Show Foo where 
    show = ... 
    -- or 
    show x = ... 

donde ... contiene su definición de la función de showFoo.

Así que en este caso que desee:

instance Show Prediction where 
    show = showPrediction 

o, ya que no es una razón importante para tener showPrediction en absoluto:

instance Show Prediction where 
    show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c 
+0

Sí, esto fue todo. Muchas gracias por la respuesta! :)) –

4

reemplazar su última línea con:

instance Show Prediction where 
    show = showPrediction 
Cuestiones relacionadas