2012-08-24 7 views
11

Il seguente code:Haskell: Sopprimere le virgolette intorno corde quando mostrato

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

hello_world = "hello world" 

main = putStr $ show $ (HelloWorld, hello_world) 

Stampe:

(hello world,"hello world") 

mi piacerebbe che la stampa:

(hello world,hello world) 

cioè voglio comportamento come il seguente:

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

Purtroppo, show non soddisfa questo, come:

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

C'è una funzione che funziona come f che ho descritto sopra?

+3

È generalmente accettato come buona pratica creare un nuovo typeclass (ad esempio denominato 'PPrint') per le traduzioni a 'String's leggibili dall'uomo. –

+0

@Clinton ha risposto a una di queste risposte? –

risposta

1

Non credo ci sia un typeclass standard che farà questo per voi, ma una soluzione sarebbe quella di definire un newtype:

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

Poi show (PlainString "hello world") == "hello world" e si può usare show come di consueto con altri tipi .

13

In primo luogo, dare un'occhiata a this question. Forse sarai soddisfatto della funzione toString.

In secondo luogo, show è una funzione che associa un valore a String.

Quindi, ha senso che cita deve essere sfuggito:

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

C'è una funzione che funziona come f che ho descritto sopra?

sembra che tu stia cercando id:

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

Per completare questa ultima risposta, è possibile definire la seguente classe:

{-# 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 ++ ")" 

e la funzione f descritta sarà il printString function

Problemi correlati