如何在purescript-halogen中组合有效的事件处理程序和自定义EventUpdates?

pas*_*ssy 3 purescript halogen

在我自定义的Halogen/Purescript项目中,我遵循AJAX示例中的模式,在这里我将我的行为分解为纯粹Input的和有效Request的.

我想更改我的事件处理程序以使用该preventDefault行为,但不明白这会对UI函数的类型产生什么影响.

我通过以下方式更改事件处理程序,对AJAX示例进行了相同的更改:

之前:

H.button [ A.classes [B.btn, B.btnPrimary]
         , A.disabled busy
         , A.onclick (\_ -> pure (handler code))
         ] [ H.text "Compile" ]
Run Code Online (Sandbox Code Playgroud)

后:

H.a [ A.classes [B.btn, B.btnPrimary]
    , A.href "#compile"
    , A.disabled busy
    , A.onclick (\_ -> E.preventDefault $> pure (handler code))
    ] [ H.text "Compile" ]
Run Code Online (Sandbox Code Playgroud)

(完全差异在这里可用)

我最终得到这种类型的错误:

Cannot unify type
    Example.Ajax.Input
    with type
        Halogen.HTML.Events.Monad.Event Halogen.HalogenEffects<(http ::
        Example.Ajax.HTTP | u32519)> Example.Ajax.Input
Run Code Online (Sandbox Code Playgroud)

此时,我有点迷失是否需要调整UI函数的类型签名或者我preventDefault以错误的方式应用修饰符.

Bri*_*nna 7

$>看起来像这样的类型:

($>) :: forall a. EventHandler a -> b -> EventHandler b
Run Code Online (Sandbox Code Playgroud)

pure看起来像这样的类型:

pure :: forall a. a -> EventHandler a
Run Code Online (Sandbox Code Playgroud)

所以问题是通过一起使用,你正在制作一个如下所示的类型:

EventHandler a -> EventHandler b -> EventHandler (EventHandler b)
Run Code Online (Sandbox Code Playgroud)

但是你不想要那个,你只想要一个EventHandler b,b它的E.Event类型在哪里handler code.

最好的解决方案是不使用pure:

E.preventDefault $> handler code
Run Code Online (Sandbox Code Playgroud)

如果有时你EventHandler想要像这样使用两个值,那么使用的函数就是*>代替$>.