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