正如标题所述,我试图在我的logShow函数中使用handleAction。我导入了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)任何线索我都很高兴。
发布于 2019-09-18 10:15:40
我不是PS方面的专家,但我会尽力回答的。所以如果我错了,请纠正我:
logShow类型签名是MonadEffect m => Show a => a -> m Unit,意味着该函数的调用方应该具有MonadEffect的实例或受到MonadEffect的约束。
在您的示例中,handleAction具有forall o m. Action → H.HalogenM State Action () o m Unit的类型签名,并在其中调用logShow。您的m在这里没有描述任何特定的单点,而正如我们已经知道的,logShow的调用者应该受到MonadEffect的约束。
有几种方法可以解决这个问题:
MonadEffect约束添加到handleAction类型签名中,如下所示
o. (MonadEffect m. ) => Action→H.HalogenM State Action () o m单位
这应该有效,因为HalogenM有MonadEffect 的实例,只要您的m也有MonadEffect实例。请参阅这里m更改为Aff,因为Aff有MonadEffect的实例。,Halogen要求您的m是或有Aff的实例。Aff实例的monad堆栈,就像您在托马斯伟大的存储库中看到的那样编辑:上面的解释假设您从Effect.Class.Console导入logShow
但是,如果您使用的logShow来自具有类型签名Show a => a -> Effect Unit的Effect.Console,那么我们需要一些函数来将Effect monad转换为您的m (此函数应该具有sig Effect a -> m a类型)。而liftEffect正是你要找的。
handleAction :: forall o m. (MonadEffect m) => Action → H.HalogenM State Action () o m Unit
handleAction _ = do
liftEffect $ logShow "something"
...希望这会有所帮助:)
https://stackoverflow.com/questions/57782260
复制相似问题