Ich muss eine Datenstruktur aus einer Textdatei (Leerzeichen getrennt), ein Datenelement pro Zeile lesen. Meine erste vorläufige würdeLesen lange Datenstruktur 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))
sein Dieser Code funktioniert, aber der Code für readPerson
ist schrecklich: Ich habe das read(row!!n))
für alle Felder in meiner Datenstruktur kopieren und einfügen!
So, als ein zweiter Versuch, ich denke, dass ich Currying der Person
Funktion ausnutzen könnte, und übergeben Sie die Argumente zu der Zeit.
Uhm, muss es etwas in Hoogle sein, aber ich kann nicht die Art Signatur herauszufinden ... Es macht nichts, es sieht einfach genug, und ich kann es selbst schreiben:
readPerson row = readFields Person row
readFields f [x] = (f x)
readFields f (x:xs) = readFields (f (read x)) xs
Ahh, sieht viel besser aus Kodierungsstil!
Aber es kompiliert nicht! Occurs check: cannot construct the infinite type: t ~ String -> t
Tat die Funktion f
ich bin readFields
vorbei hat eine andere Art Signatur in jedem Aufruf; deshalb konnte ich seine Signatur nicht erkennen ...
Meine Frage ist also: Was ist die einfachste und eleganteste Art, eine Datenstruktur mit vielen Feldern zu lesen?
siehe http://stackoverflow.com/questions/38271220/constructing-haskell-data-types-with-many-fields –
Hat 'Person' Felder mit verschiedenen Typen? Wenn ja, gibt es wahrscheinlich keine wirklich einfache Möglichkeit, dieses Problem zu beheben ... – Bakuriu