J'essaie d'ajouter une déclaration d'instance dans Haskell pour un nouveau type de données que j'ai créé sans succès. Voici ce que j'ai essayé jusqu'à présent:
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
Semble que la dernière ligne est fausse, mais je ne sais pas comment réaliser ce que je veux. Fondamentalement, il faut pouvoir appeler depuis l'interpréteur une variable Prediction et la visualiser sans avoir à appeler showPrediction. En ce moment, cela fonctionne:
showPrediction (Prediction 1 2 3)
et montre:
"1-2-3"
comme prévu, mais j'aimerais que cela fonctionne (de l'interprète):
Prediction 1 2 3
Des idées?
Pour dériver une instance, la syntaxe est
instance «preconditions» => Class «type» where
«method» = «definition»
Alors ici, par exemple, vous auriez
instance Show Prediction where
show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c
Il n'y a aucune condition préalable; vous l'utiliseriez pour quelque chose comme instance Show a => Show [a] where ...
, qui dit que si a
est affichable, alors [a]
. Ici, tous les Predictions
sont visibles, il n'y a donc rien à craindre. Lorsque vous avez écrit instance Show (Prediction p) => showPrediction p
, vous avez fait quelques erreurs. Premièrement, Prediction p
Implique que Prediction
est un type paramétré (un déclaré par, par exemple, data Prediction a = Prediction a a a
), Ce qui n'est pas le cas. Deuxièmement, Show (Prediction p) =>
implique que si Prediction P
Est affichable, alors vous voulez déclarer une autre instance. Et troisièmement, après le =>
, Avoir une fonction n'a pas de sens - Haskell voulait un nom de classe de type.
De plus, par souci d'exhaustivité, il existe une autre façon de dériver Show
si vous voulez le format Prediction 1 2 3
Pour la sortie affichée:
data Prediction = Prediction Int Int Int deriving Show
Comme spécifié dans le rapport Haskell 98 , il n'y a qu'une poignée de types qui peuvent être dérivés de cette façon: Eq
, Ord
, Enum
, Bounded
, Show
et Read
. Avec les extensions GHC appropriées , vous pouvez également dériver Data
, Typeable
, Functor
, Foldable
et Traversable
; vous pouvez dériver n'importe quelle classe dont un type encapsulé newtype
a dérivé pour un newtype
; et vous pouvez générer ces instances automatiques de manière autonome.
Vous avez une syntaxe incorrecte pour les instances. Pour créer une instance de Show
écrivez:
instance Show Foo where
show = ...
-- or
show x = ...
où ...
contient votre définition de la fonction show
pour Foo
.
Donc, dans ce cas, vous voulez:
instance Show Prediction where
show = showPrediction
ou, puisqu'il n'y a aucune raison importante d'avoir showPrediction
du tout:
instance Show Prediction where
show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c
Remplacez votre dernière ligne par:
instance Show Prediction where
show = showPrediction