[英]How to use logShow inside the handleAction function in Halogen 5
如標題所示,我正在嘗試在handleAction函數內部使用logShow。 每次單擊按鈕時,我都導入了Effect.Console (logShow)
並嘗試像這樣使用它:
handleAction ∷ forall o m. Action → H.HalogenM State Action () o m Unit
handleAction = case _ of
Update -> do
logShow "Hello"
H.modify_ \st -> st { field3 = st.field3 + 1 }
但是我只收到以下錯誤,並且我不太了解,因為我對purescript和函數式編程完全陌生。
Could not match type
Effect
with type
HalogenM
{ field1 :: Int
, field2 :: Int
, field3 :: Int
}
Action
()
o0
m1
while trying to match type Effect t2
with type HalogenM
{ field1 :: Int
, field2 :: Int
, field3 :: Int
}
Action
()
o0
m1
Unit
while checking that expression (discard (logShow "Hello")) (\$__unused -> modify_ (\st -> ... ))
has type HalogenM
{ field1 :: Int
, field2 :: Int
, field3 :: Int
}
Action
()
o0
m1
Unit
in value declaration handleAction
where m1 is a rigid type variable
bound at (line 77, column 16 - line 80, column 51)
o0 is a rigid type variable
bound at (line 77, column 16 - line 80, column 51)
t2 is an unknown type
PureScript(TypesDoNotUnify)
我很高興有任何線索。
我不是PS方面的專家,但我會盡力回答。 因此,如果我錯了,請糾正我:
logShow
類型簽名為MonadEffect m => Show a => a -> m Unit
,表示此函數的調用者應具有MonadEffect
的實例或MonadEffect
限制。
在您的情況下, handleAction
的類型簽名為handleAction
forall o m. Action → H.HalogenM State Action () om Unit
forall o m. Action → H.HalogenM State Action () om Unit
然后在其中調用logShow
。 您的此處m
沒有描述任何特定的monad,而正如我們已經知道的那樣, logShow
的調用者應受MonadEffect
約束。
有兩種方法可以解決此問題:
您可以像這樣將MonadEffect
約束添加到handleAction
類型簽名中
forall o m. (MonadEffect m) => Action → H.HalogenM State Action () om Unit
這應該工作,因為HalogenM
有實例MonadEffect
只要你的m
也有MonadEffect
實例。 看這里
將您的m
更改為Aff
因為Aff
具有MonadEffect
實例。 IIRC,鹵素要求您的m
等於或具有Aff
的實例
Aff
實例,如您在Thomas的大型存儲庫中所見 編輯 :解釋上述假設您導入logShow
從Effect.Class.Console
但是,如果您使用的logShow
來自Effect.Console
,其類型簽名為Show a => a -> Effect Unit
Effect.Console
Show a => a -> Effect Unit
,那么我們需要一些將Effect
monad轉換為m
函數(此函數的類型應該為sig Effect a -> ma
a- Effect a -> ma
)。 liftEffect
正是您想要的。
handleAction :: forall o m. (MonadEffect m) => Action → H.HalogenM State Action () o m Unit
handleAction _ = do
liftEffect $ logShow "something"
...
希望這可以幫助 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.