2011-11-19 12 views
5

Tengo una pregunta: ¿Cómo puedo anular el método de presentación para Cadena o Char? Gracias.Sobrescribir el método de mostrar para Cadena/Char en Haskell

+1

¿Hay alguna razón por la cual no desee definir otras funciones de tipo 'Char -> String' o' String -> String'? ¿Por qué quieres sobrescribir 'show'? – hammar

+4

Creo que tiene que envolverlo en un [nuevo tipo] (http://www.haskell.org/haskellwiki/Newtype) y definir Show para ese tipo. –

Respuesta

2

Si quieres hacer esto, entonces lo estás haciendo mal.

Por una razón más técnica, vea my answer a una pregunta anterior.

Usted realmente debería utilizar cualquiera de sus propias funciones a -> String (posiblemente a través de su propio tipo de clase) o utilizar una biblioteca de impresión legible para las salidas más detalladas (algunos de los cuales ya tienen una clase incorporada Pretty).

8

Puesto que la gente parece que les gusta mi comentario, aquí está como una respuesta:

Si desea volver a implementar las clases de tipos de tipos existentes, se puede envolver en un tipo -declarado newtype. Esto le permite definir sus propias implementaciones, sin ninguna sobrecarga real en tiempo de ejecución (porque newtype es isomorfo al tipo original, no hay boxeo real en el tiempo de ejecución).

Esto podría ser algo como esto:

newtype MyChar = MyChar Char 

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

Se puede usar esta envolviendo Char s con MyChar, así:

print $ fmap MyChar "test" 

Esto imprimirá

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

También puede definir showList, luego las listas de MyChar también tendrán formato personalizado. De hecho, esta es la razón por la cual mostrar listas de caracteres ([Char]) se comporta de manera diferente que mostrar otras listas ([a]). – sdcvvc

Cuestiones relacionadas