mtl : . , , transformers. , . (, , , .)
- . :
resolveEither :: (HasDatabase s,
MonadIO m,
MonadState s m)
=> String -> EitherT String m Reference
, , s, , . , , : s ( ); m IO , - m StateT s. m, , HasDatabase s => StateT s IO. :
resolveEither' :: HasDatabase s
=> String -> EitherT String (StateT s IO) Reference
resolveEither' = resolveEither
, , m, . , .
, . IO, IO, "", , <- do. , "" , . ( , "" .)
EitherT runEitherT :: EitherT e m a -> m (Either e a). , m "" EitherT ""? . StateT, runStateT :: StateT s m a -> s -> m (a, s).
(, , , Haddock "" , , "", Haddocks EitherT e m a -> .. .)
, , : s ( s), flip runStateT s . runEitherT $ resolveEither "ref", IO ((Either String Reference), s). (, , , , . flip .) fst, Either, , , , .
, , GHC , . , "" . , , IO - StateT s IO. runStateT runEitherT, , . , .
, : , retEither , , - . , .
, evalStateT, , . ?
, ; hlint .