blob: edc31c1a3c009e18b0a90bbbe860ae2757ccfc6c (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
module OuterInner where
import Control.Monad.Trans.Except
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader
-- We only need to use return once
-- because it's one big Monad
embedded :: MaybeT
(ExceptT String
(ReaderT () IO))
Int
--embedded = return 1
embedded = MaybeT . ExceptT . ReaderT $ return . (const (Right (Just 1)))
-- We can sort of peel away the layers one by one:
maybeUnwrap :: ExceptT String
(ReaderT () IO) (Maybe Int)
maybeUnwrap = runMaybeT embedded
-- Next
eitherUnwrap :: ReaderT () IO
(Either String (Maybe Int))
eitherUnwrap = runExceptT maybeUnwrap
-- Lastly
readerUnwrap :: ()
-> IO (Either String
(Maybe Int))
readerUnwrap = runReaderT eitherUnwrap
|