AP
$!
внутриSize: a a a
AP
$!
внутрик
к
к
AP
AP
AA
K
ApiT
, который отвечает за соединение с API ВК и обработку ошибок типа ApiError
:newtype ApiT m a = ApiTТеперь я хочу наслоить на
{ runApiT :: ReaderT ApiConnection (ExceptT ApiError m) a
}
ApiT
работу с Long Poll API. Для этого я добавляю StateT
LongPollState
, но при этом тип обрабатываемых ошибок меняется с ApiError
на LongPollError
(LongPollError
может обернуть ApiError
с помощью одного из конструкторов). newtype LongPollApiT m a = LongPollApiTТогда я могу написать функцию, которая будет
{ runLongPollApiT :: StateT LongPollState (ReaderT ApiConnection (ExceptT LongPollError m)) a
}
lift
ить ApiT
в LongPollApiT
.LongPollApiT
, точно также дублируя код.StateT LongPollState (ApiT m) a
Но при этом я хочу гарантировать, что ApiT
может кидать только ApiError
, а LongPollApiT
- LongPollError
.ApiT
типом ошибок не очень хочется, но если это лучший вариант, то я сделаю так)K
withExceptT
?AP
K
AP
newtype ApiT e m a = ... ExceptT e m
type SimpleApi = ApiT ApiError
AP
AP
type LongPollApiT m = ApiT LongPollError (StateT LongPollState m)
?AP
K
K
type LongPollApiT m = ApiT LongPollError (StateT LongPollState m)
?StateT
поместили внутрь, а не снаружи?AP
AP
AP