È sicuro in Haskell salvare una struttura dati in un file usando "show" e recuperarlo usando "read"?

5

Dire che ho i seguenti tipi:

type EndsTup = (Int,Int)
    -- (0-based index from start or end, Frequency)
type FreqTup = (Char, [EndsTup], [EndsTup])
    -- (Character, Freqs from start, Freqs from end)
type FreqData = [FreqTup]
    -- 1 entry in the list for each letter

Che sto usando per memorizzare dati riguardanti la frequenza della posizione di un personaggio in una parola. Se voglio salvare questo in un file, è sicuro (come garantito non corrompere se è scritto senza errori) per convertire la struttura in una stringa usando show, e quindi leggerlo usando qualcosa come:

readData <- readFile filePath
let reconstructed = read readData :: FreqData

Sto solo chiedendo perché sembra "troppo facile". È così che viene in genere fatto?

    
posta Carcigenicate 16.07.2014 - 20:13
fonte

2 risposte

6

È perfettamente sicuro farlo in questo modo, specialmente dal momento che, come ha rilevato Doval, tutte le istanze di Show e Read che stai utilizzando sono nella libreria standard e sono quindi garantite per cooperare con ciascuna altro senza alcuna difficoltà.

Tuttavia, non è generalmente il metodo consigliato per farlo, semplicemente perché il salvataggio in testo leggibile da umani (e Haskell- read ) non è affatto efficiente come un binario basato su tag formato. Per questo, puoi utilizzare il pacchetto binary , che include già istanze per tutti i tipi di dati che stai utilizzando nella domanda.

Ancora di più, però, usare il pacchetto binary per serializzare e deserializzare da disco è ancora più facile , quindi usare Show e Read ! (Usa le funzioni encodeFile e decodeFile ( OrFail ) da Data.Binary modulo .) In generale, ci si deve abituare a cose di Haskell che sono molto più semplici, almeno nei casi comuni, quindi sono tipicamente nella maggior parte delle lingue imperative. :)

    
risposta data 17.07.2014 - 07:31
fonte
1

Non l'ho provato, ma tutti i segni indicano "sì", purché si utilizzino le istanze derivate.

Il Preludio ha questo da dire su Mostra :

Derived instances of Show have the following properties, which are compatible with derived instances of Read:

  • The result of show is a syntactically correct Haskell expression containing only constants, given the fixity declarations in force at the point where the type is declared. It contains only the constructor names defined in the data type, parentheses, and spaces. When labelled constructor fields are used, braces, commas, field names, and equal signs are also used.
  • If the constructor is defined to be an infix operator, then showsPrec will produce infix applications of the constructor.
  • the representation will be enclosed in parentheses if the precedence of the top-level constructor in x is less than d (associativity is ignored). Thus, if d is 0 then the result is never surrounded in parentheses; if d is 11 it is always surrounded in parentheses, unless it is an atomic expression.
  • If the constructor is defined using record syntax, then show will produce the record-syntax form, with the fields given in the same order as the original declaration.

E ha questo da dire su Leggi :

Derived instances of Read make the following assumptions, which derived instances of Show obey:

  • If the constructor is defined to be an infix operator, then the derived Read instance will parse only infix applications of the constructor (not the prefix form).
  • Associativity is not used to reduce the occurrence of parentheses, although precedence may be.
  • If the constructor is defined using record syntax, the derived Read will parse only the record-syntax form, and furthermore, the fields must be given in the same order as the original declaration.
  • The derived Read instance allows arbitrary Haskell whitespace between tokens of the input string. Extra parentheses are also allowed.

Enfasi sulla mia.

    
risposta data 16.07.2014 - 20:34
fonte

Leggi altre domande sui tag