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

时间:2015-04-19 11:54:59

标签: purescript halogen

在我的自定义Halogen / Purescript项目中,我遵循AJAX Example中的模式,我将我的行为分为纯Input和有效的Request

我想更改我的事件处理程序以使用preventDefault行为,但不了解这对UI功能类型的影响。

我通过以下方式更改事件处理程序对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" ]

(Full diff available here

我最终遇到了这种类型错误:

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

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

1 个答案:

答案 0 :(得分:7)

$>的类型如下:

($>) :: forall a. EventHandler a -> b -> EventHandler b

pure的类型如下:

pure :: forall a. a -> EventHandler a

所以问题在于将两者结合使用,你正在制作一个如下所示的类型:

EventHandler a -> EventHandler b -> EventHandler (EventHandler b)

但你不希望这样,你只需要一个EventHandler b,其中bE.Event类型的handler code

最佳解决方案是不使用pure

E.preventDefault $> handler code

如果您有两个EventHandler值,您希望像这样一起使用,则要使用的函数是*>而不是$>