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 或某种方式可以统一类型?
根据 launchAff
的 documentation:
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
计算中执行其他效果。
我在编译以下内容时遇到问题:
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 或某种方式可以统一类型?
根据 launchAff
的 documentation:
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
计算中执行其他效果。