Advertisement
Guest User

Untitled

a guest
Sep 28th, 2016
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.15 KB | None | 0 0
  1. import Control.Monad.Reader
  2.  
  3. data Foo m = Foo { action :: m Int }
  4.  
  5. runFoo :: (MonadReader (Foo m) m) => m Int
  6. runFoo = ask >>= action
  7.  
  8. bar :: IO Int
  9. bar = runReaderT runFoo (Foo readLn)
  10.  
  11. {-
  12. error:
  13. • Couldn't match type ‘IO’ with ‘ReaderT (Foo IO) IO’
  14. arising from a functional dependency between:
  15. constraint ‘MonadReader
  16. (Foo (ReaderT (Foo IO) IO)) (ReaderT (Foo IO) IO)’
  17. arising from a use of ‘runFoo’
  18. instance ‘MonadReader r (ReaderT r m)’ at <no location info>
  19. • In the first argument of ‘runReaderT’, namely ‘runFoo’
  20. In the expression: runReaderT runFoo (Foo readLn)
  21. In an equation for ‘bar’: bar = runReaderT runFoo (Foo readLn)
  22. -}
  23.  
  24.  
  25. -- This does though:
  26.  
  27. runFoo :: (MonadReader (Foo n) m) => m (n Int)
  28. runFoo = action <$> ask
  29.  
  30. ioFoo :: (MonadIO m) => Foo m
  31. ioFoo = Foo (liftIO readLn)
  32.  
  33. bar :: (MonadIO m) => m Int
  34. bar = join $ runReaderT runFoo ioFoo
  35.  
  36.  
  37. -- This does not:
  38.  
  39. runFoo :: (MonadReader (Foo m) m) => m Int
  40. runFoo = ask >>= action
  41.  
  42. ioFoo :: MonadIO m => Foo m
  43. ioFoo = Foo $ liftIO readLn
  44.  
  45. bar :: MonadIO m => m Int
  46. bar = runReaderT runFoo ioFoo
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement