Haskell: Sopprimere le virgolette stringhe quando indicato

Seguenti codice:

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

hello_world = "hello world"

main = putStr $ show $ (HelloWorld, hello_world)

Stampa:

(hello world,"hello world")

Mi piacerebbe che la stampa:

(hello world,hello world)

cioè voglio un 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?

  • È generalmente accettato di essere una buona pratica per creare un nuovo typeclass (ad esempio, nome PPrint) per traduzioni leggibile Strings.
  • qualcuna di queste risposte di aiuto?
  • f HelloWorld = "hello world" richiede l’analisi lessicale e il caso di cambiare. Regex potrebbe essere il biglietto.
InformationsquelleAutor Clinton | 2012-08-24

 

3 Replies
  1. 18

    In primo luogo, dare un’occhiata a questa domanda. Forse sarete soddisfatti con toString funzione.

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

    Quindi, ha senso che le quotazioni dovrebbero essere evitati:

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

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

    Sembra che stai cercando id:

    > putStrLn $ id "string"
    string
    > putStrLn $ show "string"
    "string"
  2. 4

    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 descritto sarà il printString funzione

  3. 1

    Io non credo che ci sia uno standard typeclass che farà questo per voi, ma una soluzione potrebbe essere 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ò utilizzare show come di consueto con altri tipi.

Lascia un commento