summaryrefslogtreecommitdiff
path: root/Haskell-book/26/Embedded/src/OuterInner.hs
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