2012-08-24 22 views
11

La siguiente code:Haskell: Suprime comillas alrededor de las cuerdas cuando se muestra

data HelloWorld = HelloWorld; 
instance Show HelloWorld where show _ = "hello world"; 

hello_world = "hello world" 

main = putStr $ show $ (HelloWorld, hello_world) 

Prints:

(hello world,"hello world") 

me gustaría que para imprimir:

(hello world,hello world) 

es decir, quiero comportamiento como el siguiente:

f "hello world" = "hello world" 
f HelloWorld = "hello world" 

Desafortunadamente, show no satisface esto, como:

show "hello world" = "\"hello world\"" 

¿Hay una función que funciona como f que he descrito más arriba?

+3

En general, se acepta como buena práctica crear una nueva clase de letra (por ejemplo, denominada 'PPrint') para las traducciones a 'Cuerdas' humanamente legibles. –

+0

@Clinton ¿Alguna de estas respuestas fue útil? –

Respuesta

1

No creo que hay una clase de tipos estándar que va a hacer esto para usted, pero una solución alternativa sería definir un newtype:

newtype PlainString = PlainString String 
instance Show PlainString where 
    show (PlainString s) = s 

Entonces show (PlainString "hello world") == "hello world" y se puede utilizar como show normal con otros tipos .

13

En primer lugar, eche un vistazo a this question. Quizás esté satisfecho con la función toString.

En segundo lugar, show es una función que asigna algún valor a String.

Por lo tanto, tiene sentido que la cita debe ser escapado:

> show "string" 
"\"string\"" 

¿Hay una función que funciona como f que he descrito más arriba?

Parece que estás buscando id:

> putStrLn $ id "string" 
string 
> putStrLn $ show "string" 
"string" 
3

Para completar esta última respuesta, se puede definir la clase siguiente:

{-# LANGUAGE TypeSynonymInstances #-} 

class PrintString a where 
    printString :: a -> String 

instance PrintString String where 
    printString = id 

instance PrintString HelloWorld where 
    printString = show 

instance (PrintString a, PrintString b) => PrintString (a,b) where 
    printString (a,b) = "(" ++ printString a ++ "," ++ printString b ++ ")" 

y la función f descrito será el Función printString

Cuestiones relacionadas