3

在我的自定义 Halogen/Purescript 项目中,我遵循AJAX 示例中的模式,将我的操作分为 pure Inputs 和 effectful Requests。

我想更改我的事件处理程序以使用该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" ]

(此处提供完整差异)

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

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以错误的方式应用修饰符有点迷茫。

4

1 回答 1

8

类型$>看起来像:

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

类型pure看起来像:

pure :: forall a. a -> EventHandler a

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

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

但你不想要那个,你只想要一个EventHandler bbE.Event类型在哪里handler code

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

E.preventDefault $> handler code

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

于 2015-04-19T14:13:34.783 回答