Как мне объединить эффективные обработчики событий и пользовательские EventUpdates в purescript-halogen?
В моем собственном проекте Halogen/Purescript я следую примеру из примера AJAX, где делю свои действия на чистые Input
и эффективный Request
s.
Я хочу изменить свой обработчик событий, чтобы использовать preventDefault
поведение, но не понимаю, какие последствия для типа функции пользовательского интерфейса это влечет за собой.
Я сделал те же изменения в Примере AJAX, изменив обработчик событий следующим образом:
До:
H.button [ A.classes [B.btn, B.btnPrimary]
, A.disabled busy
, A.onclick (\_ -> pure (handler code))
] [ H.text "Compile" ]
После:
H.a [ A.classes [B.btn, B.btnPrimary]
, A.href "#compile"
, A.disabled busy
, A.onclick (\_ -> E.preventDefault $> pure (handler code))
] [ H.text "Compile" ]
(Полная версия доступна здесь)
Я в конечном итоге с этой ошибкой типа:
Cannot unify type
Example.Ajax.Input
with type
Halogen.HTML.Events.Monad.Event Halogen.HalogenEffects<(http ::
Example.Ajax.HTTP | u32519)> Example.Ajax.Input
В этот момент я немного растерялся, нужно ли мне настраивать сигнатуру типа функции пользовательского интерфейса или я применяю preventDefault
модификатор неправильный путь.
1 ответ
Тип $>
похоже:
($>) :: forall a. EventHandler a -> b -> EventHandler b
Тип pure
похоже:
pure :: forall a. a -> EventHandler a
Итак, проблема в том, что, используя оба вместе, вы создаете тип, который выглядит следующим образом:
EventHandler a -> EventHandler b -> EventHandler (EventHandler b)
Но вы не хотите этого, вы просто хотите EventHandler b
, где b
это E.Event
тип handler code
,
Лучшее решение - просто не использовать pure
:
E.preventDefault $> handler code
Если когда-нибудь у вас есть два EventHandler
значения, которые вы хотите использовать вместе, как это, функция для использования *>
вместо $>
,