首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Halogen 5中的logShow函数中使用handleAction

如何在Halogen 5中的logShow函数中使用handleAction
EN

Stack Overflow用户
提问于 2019-09-04 05:54:55
回答 1查看 282关注 0票数 2

正如标题所述,我试图在我的logShow函数中使用handleAction。我导入了Effect.Console (logShow)并尝试像这样使用它,每次单击一个按钮:

代码语言:javascript
复制
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和非常陌生。

代码语言:javascript
复制
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)

任何线索我都很高兴。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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的约束。

有几种方法可以解决这个问题:

  1. 可以将MonadEffect约束添加到handleAction类型签名中,如下所示 o. (MonadEffect m. ) => Action→H.HalogenM State Action () o m单位 这应该有效,因为HalogenMMonadEffect 的实例,只要您的m也有MonadEffect实例。请参阅这里
  2. m更改为Aff,因为AffMonadEffect的实例。,Halogen要求您的m是或有Aff的实例。
  3. 或者您可以使用您自己的具有Aff实例的monad堆栈,就像您在托马斯伟大的存储库中看到的那样

编辑:上面的解释假设您从Effect.Class.Console导入logShow

但是,如果您使用的logShow来自具有类型签名Show a => a -> Effect UnitEffect.Console,那么我们需要一些函数来将Effect monad转换为您的m (此函数应该具有sig Effect a -> m a类型)。而liftEffect正是你要找的。

代码语言:javascript
复制
handleAction :: forall o m. (MonadEffect m) => Action → H.HalogenM State Action () o m Unit
handleAction _ = do
  liftEffect $ logShow "something"
  ...

希望这会有所帮助:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57782260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档