web-dev-qa-db-fra.com

Nouvelle déclaration d'instance pour Show

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?

31
Cristobal Viedma

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.

56

Vous avez une syntaxe incorrecte pour les instances. Pour créer une instance de Show écrivez:

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

... 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
14
sepp2k

Remplacez votre dernière ligne par:

instance Show Prediction where
    show = showPrediction
4
oino