[英]How do I combine effectful event handlers and custom EventUpdates in 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" ]
后:
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
修飾符。
$>
的類型如下:
($>) :: 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
值,那么使用的函數是*>
而不是$>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.