
On Fri, Jun 07, 2002 at 09:54:16PM -0700, Hal Daume III wrote:
see http://haskell.org/wiki/wiki?ThatAnnoyingIoType and http://haskell.org/wiki/wiki?UsingIo
my apologies. please assume that i am really stupid. i have already read those two. i have also read what the hell are monads and monads for the working haskell programmer. i still do not get what i am doing wrong. getDepends :: String -> [String] getDepends p = do handle <- openFile (portsDir ++ p ++ "/+CONTENTS") ReadMode fetchDepends handle to my brain this takes a string, concatenates it with portsDir and "+/CONTENTS", and passes it to openfile. openFile then returns a handle and this handle and passes it to fetchDepends. getDepends will return whatever fetchDepends returns, assuming openFile succeeds. however ghc says Phoebe.hs:19: Couldn't match `[]' against `IO' Expected type: [t] Inferred type: IO Handle In the application `openFile (portsDir ++ (p ++ "/+CONTENTS")) ReadMode' In a 'do' expression pattern binding: handle <- openFile (portsDir ++ (p ++ "/+CONTENTS")) ReadMode i do not know what this [t] is and i do not know why it is expected. my theory is it is being caused by something in fetchDepends. fetchDepends :: Handle -> [String] fetchDepends handle = do l <- hGetLine handle e <- hIsEOF handle case (not e) of True -> case (matchRegex (mkRegex "^@pkgdep") l) of Just [a] -> [drop 8 l] ++ (fetchDepends handle) _ -> fetchDepends handle False -> [] here ghc reports Phoebe.hs:24: Couldn't match `[]' against `IO' Expected type: [t] Inferred type: IO String In the application `hGetLine handle' In a 'do' expression pattern binding: l <- hGetLine handle i am thinking that this has something to do with l. but i cant think of anything beyond that. here a couple of other attempts to show that i am trying and that i have no clue what i am doing. -- put a return around everything that might need it getDepends :: String -> [String] getDepends p = do handle <- openFile (portsDir ++ p ++ "/+CONTENTS") ReadMode return (fetchDepends handle) fetchDepends :: Handle -> [String] fetchDepends handle = do l <- hGetLine handle e <- hIsEOF handle case (not e) of True -> case (matchRegex (mkRegex "^@pkgdep") l) of Just _ -> return ([drop 8 l] ++ (fetchDepends handle)) _ -> return (fetchDepends handle) False -> return [] -- try making l into a string by show'ing it getDepends :: String -> [String] getDepends p = do handle <- openFile (portsDir ++ p ++ "/+CONTENTS") ReadMode fetchDepends handle fetchDepends :: Handle -> [String] fetchDepends handle = do l <- hGetLine handle e <- hIsEOF handle case (not e) of True -> case (matchRegex (mkRegex "^@pkgdep") (show l)) of Just _ -> [drop 8 (show l)] ++ (fetchDepends handle) _ -> fetchDepends handle False -> [] -- try removing the type declarations getDepends p = do handle <- openFile (portsDir ++ p ++ "/+CONTENTS") ReadMode fetchDepends handle fetchDepends handle = do l <- hGetLine handle e <- hIsEOF handle case (not e) of True -> case (matchRegex (mkRegex "^@pkgdep") l) of Just _ -> [drop 8 l] ++ (fetchDepends handle) _ -> fetchDepends handle False -> [] Phoebe.hs:27: Couldn't match `[[Char]]' against `IO [[Char]]' Expected type: [[Char]] Inferred type: IO [[Char]] In the application `fetchDepends handle' In the second argument of `(++)', namely `(fetchDepends handle)' Failed, modules loaded: none. ok. a different error message. it still makes no sense. i will try a couple more times before i finish this message. -- try show'ing (fetchDepends handle) getDepends p = do handle <- openFile (portsDir ++ p ++ "/+CONTENTS") ReadMode fetchDepends handle fetchDepends handle = do l <- hGetLine handle e <- hIsEOF handle case (not e) of True -> case (matchRegex (mkRegex "^@pkgdep") l) of Just _ -> [drop 8 l] ++ (show (fetchDepends handle)) _ -> fetchDepends handle False -> [] error message is Phoebe.hs:27: Couldn't match `IO' against `[]' Expected type: IO t Inferred type: [a] In the application `(++) [drop 8 l] (show (fetchDepends handle))' In a case alternative: [drop 8 l] ++ (show (fetchDepends handle)) great another error message that is meaningless to me. one last attempt. -- try adding the type decs back into the above code getDepends :: String -> [String] getDepends p = do handle <- openFile (portsDir ++ p ++ "/+CONTENTS") ReadMode fetchDepends handle fetchDepends :: Handle -> [String] fetchDepends handle = do l <- hGetLine handle e <- hIsEOF handle case (not e) of True -> case (matchRegex (mkRegex "^@pkgdep") l) of Just _ -> [drop 8 l] ++ (show (fetchDepends handle)) _ -> fetchDepends handle False -> [] Phoebe.hs:19: Couldn't match `[]' against `IO' Expected type: [t] Inferred type: IO Handle In the application `openFile (portsDir ++ (p ++ "/+CONTENTS")) ReadMode' In a 'do' expression pattern binding: handle <- openFile (portsDir ++ (p ++ "/+CONTENTS")) ReadMode Phoebe.hs:24: Couldn't match `[]' against `IO' Expected type: [t] Inferred type: IO String In the application `hGetLine handle' In a 'do' expression pattern binding: l <- hGetLine handle i am back to the old message none the wiser. please help me. i am going insane. sincerly, chris moline