在我的自定义 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" ]

(完整差异可用 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 修饰符有点迷茫。

最佳答案

$> 的类型如下所示:

($>) :: forall a. EventHandler a -> b -> EventHandler b
pure 的类型如下所示:
pure :: forall a. a -> EventHandler a

所以问题是通过同时使用两者,你​​正在制作一个看起来像这样的类型:
EventHandler a -> EventHandler b -> EventHandler (EventHandler b)

但是你不想那样,你只需要一个 EventHandler b ,其中 bE.Eventhandler code 类型。

最好的解决方案是不使用 pure :
E.preventDefault $> handler code

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

关于purescript - 如何在 purescript-halogen 中结合有效的事件处理程序和自定义 EventUpdates?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29729517/

10-11 17:26