Экземпляр MonadTransControl для ProxyFast / ProxyCorrect

Используя каналы, я пытаюсь написать экземпляр MonadTransControl для ProxyFast или ProxyCorrect. Вот что у меня есть:

instance MonadTransControl (ProxyFast a' a b' b) where
  data StT (ProxyFast a' a b' b) a = StProxy { unStProxy :: ProxyFast a' a b' b Identity a}
  liftWith = undefined
  restoreT = undefined

Понятия не имею, как написать liftWith или restoreT. Все экземпляры для других преобразователей монад используют функцию, которая «меняет местами» монады, например EitherT e m a -> m (EitherT e Identity a), но я не смог найти такую ​​функцию в каналах. Как выглядит экземпляр для MonadTransControl для ProxyCorrect / ProxyFast? Или написать невозможно? (Если да, возможно ли это в pipe 4.0?)


person bennofs    schedule 07.07.2013    source источник
comment
Я никогда не понимал MonadTransControl. Есть ли какой-нибудь учебник или сообщение в блоге, в котором объясняется, как его использовать?   -  person Gabriel Gonzalez    schedule 07.07.2013


Ответы (1)


Спасибо за ссылку, и теперь я могу дать более точный ответ.

Нет, это невозможно реализовать, используя любую версию pipes. Причина в том, что MonadTransControl ожидает, что преобразователь монад будет построен поверх одного слоя базовой монады, лежащей в основе. Это верно для всех преобразователей монад, которые MonadTransControl в настоящее время реализуют, например:

ErrorT  ~ m (Either e r)
StateT  ~ s -> m (r, s)
WriterT ~ m (r, w)
ReaderT ~ i -> m r
ListT   ~ m [r]  -- This version of ListT is wrong, and the true ListT
                 -- would not work for `MonadTransControl`

Однако Proxy не оборачивает ни одного слоя базовой монады. Это верно для обеих pipes версий, где вы можете вложить столько слоев базовой монады, сколько захотите.

Фактически, любой преобразователь монад, который многократно вставляет базовую монаду, будет игнорировать экземпляр MonadTransControl, например:

FreeT     -- from the `free` package
ListT     -- when done "right"
ConduitM  -- from the `conduit` package

Однако то, что pipes не реализует MonadTransControl, не означает, что вся надежда потеряна. pipes-safe реализует многие операции, которые обычно можно ожидать от MonadTransControl, например bracketing приобретения ресурсов, поэтому, если вы можете уточнить свой конкретный вариант использования, я могу рассказать вам больше, есть ли подходящее решение на основе pipes для вашей проблемы.

person Gabriel Gonzalez    schedule 07.07.2013
comment
Спасибо за ответ. Вы правы, я искал сейф для трубок. - person bennofs; 07.07.2013