Интересно, кто-нибудь знает, как я могу реорганизовать 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
, чтобы облегчить эту болевую точку?