2013-04-25 10 views
9

Ho giocato con il modulo Text.Show.Pretty e consente di serializzare le strutture dati Haskell come i record in un formato leggibile dall'uomo & sarà ancora in grado di deserializzare facilmente utilizzando read. Il formato di output è ancora più leggibile di YAML e JSON.È una pratica ragionevole serializzare le strutture dati Haskell sul disco usando solo Mostra/Leggi

Esempio di uscita a puntate per un record di Haskell utilizzando Text.Show.Pretty:

Book 
    { author = "Plato" 
    , title = "Republic" 
    , numbers = [ 123 
       , 1234 
       ] 
    } 

provenienti dal mondo Ruby, so che YAML e JSON sono formato preferito la maggior parte Rubysti per la serializzazione strutture di dati. Le istanze di Haskell Show and Read sono spesso utilizzate per raggiungere lo stesso scopo in Haskell?

risposta

15

Per le grandi strutture, non lo consiglierei. read è più lento di melassa. Aneddoto: ho un programma chiamato yeganesh. Concettualmente, è abbastanza semplice: leggere in un [(String,Double)] con circa 2000 elementi e discarica fuori le chiavi ordinati per i loro elementi. Ho usato per conservare questo utilizzando Show/Read, ma ha trovato che il passaggio a una stampante personalizzato e parser accelerato il programma di un fattore 8. (Nota:. Non è che l'analisi accelerato da un fattore di otto Il intero programma accelerato di un fattore 8. Ciò significa che l'analisi si è accelerata di un fattore più grande di quello.) Ciò ha fatto la differenza tra pause lunghe e gratificazioni istantanee.

+1

Il tuo parser era basato su Text.Parsec o Data.Attoparsec o qualcos'altro? – dan

+0

@ Dan Si può vedere sul [pag Hackage] (http://new-hackage.haskell.org/package/yeganesh) che nessuno dei 'Text',' bytestring', 'binary',' attoparsec', etc. fanno parte delle dipendenze, quindi non devi nemmeno fare qualcosa di sofisticato o cambiare i tipi di dati per ottenere una grande vincita! Ho appena copiato la fonte di 'read' per il mio tipo di dati e ritagliato i bit che sapevo che non avrei usato. –

6

Sono d'accordo con Daniel Wagner, ma se si vuole un file che un utente può manipolare con semplici editor di testo è possibile utilizzare la lettura/spettacolo per un piccolo insieme di dati, alias i file di configurazione.

Tuttavia non credo che sia un modo comune tra gli haskellers, di solito uso parsec invece di leggere 'config data' e una classe/istanza personalizzata invece di Mostra.

Se si dispone di molti dati, in genere si utilizza Data.Binary o Data.Serialize.

Problemi correlati