2012-10-21 6 views
1

Voici mon type de données:Haskell, type de données paramétrées Conversion en chaîne de

data Foo a = Value Integer 
      |Boo a 

et j'ai une fonction pour convertir le Foo datatype en chaîne:

showFoo::Show a=> Foo a -> String 
showFoo (Value n) = show n 
showFoo (Boo a) = show a 

Par exemple: showFoo (Value 10) devient: "10", mais pour showFoo (Boo "S"), il devient: "\" S \ "" mais je n'ai besoin que de "S".

Répondre

4

Cela se résume au comportement de show avec des chaînes. show est conçu pour donner une sortie lisible par une machine, ce n'est pas une jolie imprimante, donc il met des virgules inversées autour de toutes les chaînes. De cette façon, il peut dire la différence entre 10 et "10" quand il les lire avant.

Votre fonction showFoo est clairement pas conçu pour être dans la famille show, puisqu'elle oblitère les Value et Boo balises, donc en utilisant show n'est pas vraiment ce que vous voulez dire.

solutions possibles:

  1. Donnez, allez le porc entier et d'en tirer Show.
  2. Si a est toujours une chaîne, changez votre type de données et n'utilisez pas show.
  3. En savoir plus sur les classes de types et définir votre propre classe Showish. Utilisez -XFlexibleInstances et -XOverlappingInstances pour remplacer l'instance de Chaîne et n'utilisez pas de guillemets.
  4. il Hack en utilisant init.tail.show $ a
1

C'est juste un résultat de votre utilisation de GHCi et de son résultat précédent. Essayez ceci dans un programme compilé ou essayez d'exécuter (dans GHCi) putStrLn (showFoo (Boo "S")) et vous verrez qu'appeler show sur une chaîne de caractères entraîne un ensemble unique de guillemets.

+0

Je comprends votre point, mais je ne peux pas changer la signature de la fonction (putStrLn ne peut pas être utilisé). – Sam

+0

Je sympathise avec vous, mais je ne peux pas (ou je ne suis pas motivé) aider quand il y a des contraintes artificielles. Je suppose que vous pourriez faire quelque chose comme 'filter (/ = '' ') (show a)' (ou simplement abandonner conditionnellement '" 's'ils sont le premier et le dernier caractère). –

+1

Je suis à peu près sûr que le problème fondamental est que l'OP veut que 'show" foo "' aboutisse à "foo" '. Je ne pense pas ne pas vouloir mettre une fonction 'Foo a -> String' dans la monade IO et toujours écrire à la console est une" contrainte artificielle "sur la solution. – Ben

Questions connexes