在我的自定义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
修饰符,我有点迷失。
答案 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
,其中b
是E.Event
类型的handler code
。
最佳解决方案是不使用pure
:
E.preventDefault $> handler code
如果您有两个EventHandler
值,您希望像这样一起使用,则要使用的函数是*>
而不是$>
。