
Hi, I have the following program: import Control.Monad.Reader first :: Reader [String] String first = do strings <- ask return $ if (null strings) then "empty" else head strings printFirst :: ReaderT [String] IO () printFirst = do strings <- ask let theFirstString = runReader first strings liftIO $ putStrLn theFirstString main = runReaderT printFirst ["first","second"] It compiles and works. However, in the printFirst function I am explicitly using ask and I am calling runReader. Can I somehow avoid doing that? The following version of the printFirst function does not compile. printFirst :: ReaderT [String] IO () printFirst = do theFirstString <- first liftIO $ putStrLn theFirstString Program2.hs:11:21: Couldn't match type `Data.Functor.Identity.Identity' with `IO' Expected type: ReaderT [String] IO String Actual type: Reader [String] String In a stmt of a 'do' block: theFirstString <- first In the expression: do { theFirstString <- first; liftIO $ putStrLn theFirstString } Can I somehow call first without using ask and runReader ? Regards Grzegorz Balcerek