Как мне объединить эффективные обработчики событий и пользовательские EventUpdates в purescript-halogen?

В моем собственном проекте Halogen/Purescript я следую примеру из примера AJAX, где делю свои действия на чистые Inputи эффективный Requests.

Я хочу изменить свой обработчик событий, чтобы использовать 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 значения, которые вы хотите использовать вместе, как это, функция для использования *> вместо $>,

Другие вопросы по тегам