Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import Control.Monad.Reader
- data Foo m = Foo { action :: m Int }
- runFoo :: (MonadReader (Foo m) m) => m Int
- runFoo = ask >>= action
- bar :: IO Int
- bar = runReaderT runFoo (Foo readLn)
- {-
- error:
- • Couldn't match type ‘IO’ with ‘ReaderT (Foo IO) IO’
- arising from a functional dependency between:
- constraint ‘MonadReader
- (Foo (ReaderT (Foo IO) IO)) (ReaderT (Foo IO) IO)’
- arising from a use of ‘runFoo’
- instance ‘MonadReader r (ReaderT r m)’ at <no location info>
- • In the first argument of ‘runReaderT’, namely ‘runFoo’
- In the expression: runReaderT runFoo (Foo readLn)
- In an equation for ‘bar’: bar = runReaderT runFoo (Foo readLn)
- -}
- -- This does though:
- runFoo :: (MonadReader (Foo n) m) => m (n Int)
- runFoo = action <$> ask
- ioFoo :: (MonadIO m) => Foo m
- ioFoo = Foo (liftIO readLn)
- bar :: (MonadIO m) => m Int
- bar = join $ runReaderT runFoo ioFoo
- -- This does not:
- runFoo :: (MonadReader (Foo m) m) => m Int
- runFoo = ask >>= action
- ioFoo :: MonadIO m => Foo m
- ioFoo = Foo $ liftIO readLn
- bar :: MonadIO m => m Int
- bar = runReaderT runFoo ioFoo
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement