
As a Haskell beginner, I would also like to recommend HLint as a very
useful tool to catch these kinds of things.
On Sep 3, 2014 12:25 PM, "Peter Jones"
"Jeff C. Britton"
writes: That suggestion works. I will have to continue learning more about Monads.
I should have also mentioned that if you enable GHC warnings it should tell you that having the `return` before `loop` is discarding the value given to it.
-----Original Message----- From: Beginners [mailto:beginners-bounces@haskell.org] Sent: Thursday, August 28, 2014 7:11 AM To: beginners@haskell.org Subject: Re: [Haskell-beginners] Haskeline and forkIO
"Jeff C. Britton"
writes: loop :: InputT IO () loop = do maybeLine <- getInputLine "Enter a file to compress> " case maybeLine of Nothing -> return () -- user entered EOF Just "" -> return () -- treat no name as "want to quit" Just path -> do return (runWorker path) loop
The other issue you're having is because `runWorker path` is an `IO ()` value but at the point where you use it in the code the type system wants an `InputT IO ()`. To try to satisfy the type system you used `return` to build a `InputT IO (IO ())` value, but that doesn't actually work (as you've noticed). Since `InputT` is a transformer you have an extra layer to work through and so need to *lift* your `IO ()` value into the `InputT IO` layer. Try this:
-- Add this import import Control.Monad.IO.Class
loop :: InputT IO () loop = do maybeLine <- getInputLine "Enter a file to compress> " case maybeLine of Nothing -> return () -- user entered EOF Just "" -> return () -- treat no name as "want to quit" Just path -> do liftIO (runWorker path) loop
You can think of `liftIO` as having this signature (in this context):
liftIO :: IO () -> InputT IO ()
-- Peter Jones, Founder, Devalot.com Defending the honor of good code
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners