2011-11-19 3 views
5

J'ai une question: Comment puis-je remplacer la méthode show pour String ou Char? Merci.Méthode de substitution de chaîne pour String/Char dans Haskell

+1

Y at-il une raison pour laquelle vous ne voulez pas simplement définir d'autres fonctions de type 'Char -> String' ou' String -> String'? Pourquoi voulez-vous remplacer «show»? – hammar

+4

Je pense que vous devez l'emballer dans un [nouveau type] (http://www.haskell.org/haskellwiki/Newtype) et définir Show pour ce type. –

Répondre

2

Si vous voulez faire cela, alors vous le faites mal. Pour une raison plus technique, veuillez consulter le my answer pour une question précédente.

Vous vraiment devraient utiliser soit vos propres fonctions a -> String (peut-être via votre propre classe de type) ou utilisez une bibliothèque assez-impression pour les sorties plus détaillées (déjà dont certains ont une classe Pretty intégré).

8

Puisque les gens semblent aimer mon commentaire, voici comme une réponse:

Si vous voulez ré-écrire les classes de type sur les types existants, vous pouvez les envelopper dans un newtype de type -declared. Cela vous permet de définir vos propres implémentations, sans aucun surcoût au moment de l'exécution (car newtype est isomorphe au type d'origine, il n'y a pas de boxe réelle au moment de l'exécution).

Cela pourrait ressembler à ceci:

newtype MyChar = MyChar Char 

instance Show MyChar where 
    show (MyChar c) = "head \"" ++ c : "\"" 

Vous pouvez utiliser en enroulant Char s avec MyChar, comme ceci:

print $ fmap MyChar "test" 

Cette imprimera

[head "t",head "e",head "s",head "t"] 
+0

Vous pouvez également définir showList, puis les listes de MyChar auront également un formatage personnalisé. En fait, c'est pourquoi les listes de caractères ([Char]) se comportent différemment des autres listes ([a]). – sdcvvc

Questions connexes