infinitas - Haskell: Nueva declaración de instancia para Show
haskell ejemplos (3)
Estoy tratando de 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:
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 es incorrecta 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 visualizarla sin tener que llamar a showPrediction. Ahora mismo esto funciona:
showPrediction (Prediction 1 2 3)
y muestra:
"1-2-3"
como se esperaba, pero me gustaría que esto funcionara (desde el intérprete):
Prediction 1 2 3
¿Algunas ideas?
Para derivar una instancia, la sintaxis es
instance «preconditions» => Class «type» where
«method» = «definition»
Así que aquí, por ejemplo, tendrías
instance Show Prediction where
show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c
No hay condiciones previas; usaría eso para algo como la instance Show a => Show [a] where ...
, que dice que si a
es visible, entonces también lo es [a]
. Aquí, todas las Predictions
son visibles, así que no hay nada de qué preocuparse. Cuando escribiste la instance Show (Prediction p) => showPrediction p
, instance Show (Prediction p) => showPrediction p
algunos errores. Primero, la Prediction p
implica que la Prediction
es un tipo parametrizado (uno declarado, por ejemplo, data Prediction a = Prediction aaa
), que no lo es. En segundo lugar, Show (Prediction p) =>
implica que si la Prediction P
es visible, entonces desea declarar alguna otra instancia. Y tercero, después de =>
, tener una función no tiene sentido: Haskell quería un nombre de clase de tipo.
Además, para completar, hay otra manera de derivar Show
si desea que el formato de Prediction 1 2 3
muestre:
data Prediction = Prediction Int Int Int deriving Show
Como se especifica en el informe Haskell 98 , solo hay un puñado de tipos que se pueden derivar de esta manera: Eq
, Ord
, Enum
, Bounded
, Show
y Read
. Con las extensiones GHC adecuadas , también puede derivar Data
, Typeable
, Functor
, Foldable
y Traversable
; puede derivar cualquier clase derivada de un tipo envuelto de newtype
para un newtype
; y puede generar estas instancias automáticas de forma independiente.
Reemplace su última línea con:
instance Show Prediction where
show = showPrediction
Tienes la sintaxis para instancias incorrectas. Para crear una instancia de Show
write:
instance Show Foo where
show = ...
-- or
show x = ...
donde ...
contiene su definición de la función show
para Foo
.
Así que en este caso quieres:
instance Show Prediction where
show = showPrediction
o, ya que no hay una razón importante para tener showPrediction
en absoluto:
instance Show Prediction where
show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c