liftEff效果行类型统一

时间:2017-04-14 00:23:02

标签: purescript

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

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
    )

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

1 个答案:

答案 0 :(得分:1)

根据<button id='btn_click' type="button">Click me!</button> <div id="output"></div> 的{​​{3}}:

  

将异步计算转换为同步计算。所有   值被忽略,如果计算产生错误,则为   抛出。

     

使用catchException和生成的Eff捕获异常   不推荐计算,因为异常可能最终被抛出   异步,在这种情况下,他们无法被捕获。

     

如果确实需要处理异常,可以使用runAff,或者   您可以使用在Aff计算中处理异常   catchError(或任何其他机制)。

我相信你不能在(function(){ window.onload = function(){ alert("welcome to my trip record"); } })(); var shuffle = function(event){ var target = document.getElementById("output"); target.innerHTML = "Germany"; } document.getElementById('btn_click').addEventListener('click', shuffle); 内抛出异常,除非你也在同一计算中捕获它们。您只能在launchAff计算中执行其他效果。