Devo leggere una struttura dati da un file di testo (separato dallo spazio), un elemento di dati per riga. Il mio primo tentativo sarebbeLettura della struttura dei dati lunghi in Haskell
data Person = Person {name :: String, surname :: String, age :: Int, ... dozens of other fields} deriving (Show,...)
main = do
string <- readFile "filename.txt"
let people = readPeople string
do_something people
readPeople s = map (readPerson.words) (lines s)
readPerson row = Person (read(row!!0)) (read(row!!1)) (read(row!!2)) (read(row!!3)) ... (read(row!!dozens))
Questo codice funziona, ma il codice per readPerson
è terribile: devo copiare-incollare il read(row!!n))
per tutti i campi nella mia struttura dati!
Quindi, come secondo tentativo, penso che potrei sfruttare Currying della funzione Person
e passargli gli argomenti uno alla volta.
Uhm, ci deve essere qualcosa in Hoogle, ma non riesco a capire il tipo di firma ... Non importa, sembra abbastanza semplice e posso scriverla io:
readPerson row = readFields Person row
readFields f [x] = (f x)
readFields f (x:xs) = readFields (f (read x)) xs
Ahh, sembra molto meglio stile di codifica!
Ma, non viene compilato! Occurs check: cannot construct the infinite type: t ~ String -> t
Infatti, la funzione f
che sto passando a readFields
ha una firma di tipo diverso in ciascuna chiamata; è per questo che non sono riuscito a capire il suo tipo di firma ...
Quindi, la mia domanda è: qual è il modo più semplice ed elegante per leggere una struttura dati con molti campi?
vedere http://stackoverflow.com/questions/38271220/constructing-haskell-data-types-with-many-fields –
"Persone" hanno campi con tipi diversi? Se è così, probabilmente non c'è un modo veramente semplice per risolvere questo problema ... – Bakuriu