
On Tue, Mar 06, 2007 at 07:37:38PM +0100, D.V. wrote:
Hello,
I'm still learning Haskell and I am stuck on a probably simple problem.
Assume I have a file where lines are of the form "key=value"
I want to search a value in that file and came up with the following code.
rechf :: String -> IO (Maybe String) rechf r = bracket (openFile "liste" ReadMode) (hClose) (rechf2 r)
rechf2 :: String -> Handle -> IO (Maybe String) rechf2 r h= do f <- hGetContents h --print f return $ rech r $ lines f
rech :: String -> [ String ] -> Maybe String rech r l = lookup r $ map span2 l
span2 :: String->(String,String) span2 c = (a,b) where a=takeWhile (/='=') c b=drop 1 $ dropWhile (/='=') c
Now the problem is this : 1) if I try rechf, it returns nothing even for a key that exists in the file. 2) if I uncomment the line where there is "print f", the key is found and the value returned.
I cannot help you with your question more than pointing you to http://bugs.darcs.net/issue391 where Simon Marlow explains how to avoid "IO.bracket". But heres a hint: you can use ParserCombinators instead of rolling your own parser, especially if the complexity of your input formats will increase. mm
I'm guessing print forces f to be evaluated, so the file is actually read, but I was wondering why it doesn't work without it and how to correct that.
David. _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe