liftEff 效果行类型统一

liftEff Effect row type unification

我在编译以下内容时遇到问题:

module ContrivedExample where

import Prelude
import Data.Either (Either(..))
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Exception (EXCEPTION, throw)
import Control.Monad.Eff.Console (CONSOLE, log)
import Control.Monad.Eff.Class (liftEff)
import Control.Monad.Aff (launchAff)
import Control.Monad.Aff.Console (log) as A

contrivedExample :: forall e. Either String String -> Eff (exception :: EXCEPTION, console :: CONSOLE | e) Unit
contrivedExample a = do
       _ <- launchAff do
         _ <- A.log "yay"
         liftEff $ case a of
           Left e -> log e
           Right a -> throw a
       pure unit

我收到这个错误:

Could not match type

    ( console :: CONSOLE
    | e3
    )

  with type

    ( exception :: EXCEPTION
    , console :: CONSOLE
    | t2
    )

如果我从 Effect 行中删除异常,我会在 Either 的另一侧收到错误。是否有更好的替代 liftEff 或某种方式可以统一类型?

根据 launchAffdocumentation

Converts the asynchronous computation into a synchronous one. All values are ignored, and if the computation produces an error, it is thrown.

Catching exceptions by using catchException with the resulting Eff computation is not recommended, as exceptions may end up being thrown asynchronously, in which case they cannot be caught.

If you do need to handle exceptions, you can use runAff instead, or you can handle the exception within the Aff computation, using catchError (or any of the other mechanisms).

我相信你不能在 launchAff 中抛出异常,除非你也在同一个计算中捕获它们。否则,您只能在 launchAff 计算中执行其他效果。