listas infinitas ejemplos ciclos haskell

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