2011-11-19 6 views
5

Ho una domanda: Come posso eseguire l'override del metodo show per String o Char? Grazie.Metodo di override show per String/Char in Haskell

+1

C'è una ragione per cui non si desidera semplicemente definire alcune altre funzioni di tipo 'Char -> String' o' String -> String'? Perché vuoi ignorare 'show'? – hammar

+4

Penso che si debba avvolgere in un [nuovo tipo] (http://www.haskell.org/haskellwiki/Newtype) e definire Mostra per quel tipo. –

risposta

2

Se vuoi farlo, allora stai sbagliando.

Per un motivo più tecnico, vedere my answer a una domanda precedente.

È davvero dovrebbe utilizzare sia le proprie funzioni a -> String (eventualmente tramite il proprio tipo di classe) o di utilizzare una libreria pretty-stampa per le uscite più dettagliate (alcuni dei quali hanno già integrato Pretty classe).

8

Dal momento che le persone sembrano apprezzare il mio commento, qui è come una risposta:

Se si vuole reimplementare le classi di tipo sui tipi esistenti, si può avvolgere in un tipo, dichiarata newtype. Ciò consente di definire le proprie implementazioni, senza alcun overhead effettivo in fase di esecuzione (poiché newtype è isomorfo al tipo originale, non è possibile eseguire il boxing effettivo in fase di esecuzione).

Questo potrebbe essere simile a questa:

newtype MyChar = MyChar Char 

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

È possibile utilizzare questo avvolgendo Char s con MyChar, in questo modo:

print $ fmap MyChar "test" 

Questo stamperà

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

Puoi anche definire showList, quindi gli elenchi di MyChar avranno anche la formattazione personalizzata. In effetti, questo è il motivo per cui gli elenchi di caratteri ([Char]) si comportano in modo diverso rispetto agli altri elenchi ([a]). – sdcvvc