簡體   English   中英

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

[英]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約束。


有兩種方法可以解決此問題:

  1. 您可以像這樣將MonadEffect約束添加到handleAction類型簽名中

     forall o m. (MonadEffect m) => Action → H.HalogenM State Action () om Unit 

    這應該工作,因為HalogenM有實例MonadEffect 只要你的m也有MonadEffect實例。 這里

  2. 將您的m更改為Aff因為Aff具有MonadEffect實例。 IIRC,鹵素要求您的m等於或具有Aff的實例

  3. 或者,您可以使用自己的monad堆棧,該堆棧具有Aff實例,如您在Thomas的大型存儲庫中所見

編輯 :解釋上述假設您導入logShowEffect.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM