
The other thing to mention, is that if you have the ability to change file formats, it may be better to make just a slight adjustment... If you make it look exactly like the haskell data structure you want: [("Foo", [1,2,3,4,5,6,7]) ,("Bar", [7,6,5,4,3,2,1]) ,...] Then your parser becomes even simpler: parseFile :: FilePath -> IO [(String,[Int])] parseFile = do src <- readFile x return $ read src On Jan 3, 2006, at 11:33 AM, Neil Mitchell wrote:
Hi Robert,
The first thing to mention is that Haskell uses linked-lists, not arrays as the "standard" list type structure, so [1,2] is actually a linked list.
The next thing to note is that Haskell is *lazy*. It won't do work that it doens't have to. This means that you can return a linked list with all the lines in the file, but they won't actually be read til they are required. i.e. Haskell cleverly worries about all the "getting a next line as required" stuff, without you even noticing - it will read it line by line.
A simple function that does some of what you want is:
parseFile :: FilePath -> IO [(String, [Int])] parseFile x = do src <- readFile x return (map parseLine (lines src))
parseLine :: String -> (String, [Int]) parseLine = for you to write :)
The other point is that Haskell linked lists have to have every element of the same type, so you can't have ["test",1] as a linked list, what you actually want is a tuple, written ("test",1) - a tuple is of fixed length and all elements can be of different type.
Hope that helps,
Neil _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe