Как я могу использовать EventWriter вместо EventWriterT в этом случае? - PullRequest
0 голосов
/ 19 февраля 2019

Интересно, кто-нибудь знает, как я могу реорганизовать splitEventWriter1 в splitEventWriter2?Или это вообще возможно?

splitEventWriter1
  :: forall t w1 w2 m a s
  .  Reflex t
  => Monad m
  => Semigroup w1
  => Semigroup w2
  => (w1 -> (w2, Maybe s))
  -> (  EventWriterT t w1 m a
     -> EventWriterT t w2 m (a, E t s)
     )
splitEventWriter1 phi cont = do
  (r, w) <- lift $ runEventWriterT cont
  let fj = First .> Just
  let (a, b) = evsIso2 $ fmap (phi.>(_1%~fj).>(_2%~fmap First)) w
  tellEvent $ a
  return (r, b)

---------------

splitEventWriter2
  :: forall t w1 w2 m1 m2 a s
  .  Reflex t
  => Monad m1
  => Monad m2
  => Semigroup w1
  => Semigroup w2
  => EventWriter t w1 m1
  => EventWriter t w2 m2
  => (w1 -> (w2, Maybe s))
  -> (  m1 a
     -> m2 (a, E t s)
     )
splitEventWriter2 = undefined

---------------

evsIso2 :: Reflex t => E t (MayFst a, MayFst b) -> (E t a, E t b)
evsIso2 e = (phi e _1, phi e _2)
  where phi e _i = (e <&> view _i) $> fmapMaybe id $> fmap getFirst

(.>) = flip (.)
($>) = flip ($)

type MayFst a = Maybe (First a)

Вот некоторая соответствующая reflex-frp документация: http://hackage.haskell.org/package/reflex-0.5/docs/Reflex-EventWriter-Base.html#t:EventWriterT

Мне интересно, потому что кажется, что использование sEW1 связывает меня с конкретным стеком монады итребует, чтобы я использовал -> EventWriterT t c m a везде, где используется sEW1.

С одной стороны, мой вопрос касается конкретно рефлекса, т. е. в коде рефлекса чаще используется -> EventWriterT t c m a вместо возможности использования EventWriter t c m =>?

И, с другой стороны, в целом относится к коду в стиле mtl: много ли ситуаций, когда абстрактное ограничение преобразователя не может быть использовано, и нужно прибегнуть к необходимости указать, что рассматриваемый преобразователь должен находиться навершина стека?

Или, может быть, мне не хватает только одного или двух стратегически расположенных lift с?Или экземпляр или два?

пс, когда я пробую очевидное и просто меняю тип, я получаю ошибки вроде Couldn't match type ‘m1’ with ‘EventWriterT t w1 m0’, ‘m1’ is a rigid type variable bound by ...

Редактировать:

Может ли иметь смыслу меня есть getEvent функция класса для EventWriter в дополнение к tellEvent?

Я снова пытаюсь найти ответ на вопрос, который я задал вчера, задаваясь вопросом, как реализовать splitEventWriter.

И я заметил, что EventWriter фактически реализован под капотом с StateT.

Я попытался собрать его вместе, и он компилируется: https://gist.github.com/ff572e3217da1920cb32a707be16136a

Сэто, я мог бы просто реализовать splitEventWriter с ограничением EventWriter вместо того, чтобы EventWriterT портить все.

Хотя, я понимаю, что это не совсем та же семантика, что событие нене может быть разделен, только дублирован.

Что само по себе может быть полезным, так как некоторые виджеты в моем коде просто хотят реагировать на некоторые всплывающие события, не предотвращая их распространение.

Может быть сфункция класса как setEvent в дополнение к getEvent мы можемимеют обе семантики для splitEventWriter и peekEventWriter.

Хотя в этот момент мы могли бы просто захотеть назвать это EventState, EventMonad, EventCollector или как-то.

IЯ все еще сбит с толку, как кто-то из вас имеет дело с желанием разделить / заглянуть в распространяющиеся рефлекторные потоки событий в настоящее время?Вы просто возвращаете события без EventWriter?Или вы просто используете EventWriterT везде?

Или есть какой-то другой способ, о котором я не знаю?

А если нет, то стоит ли добавлять что-то вродеВыше reflex, чтобы облегчить эту болевую точку?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...