Error 与 ErrorEvent - 在 Purescript 中使用 catchException 来处理异常

Error vs ErrorEvent - Use catchException in Purescript to handle an Exception

我正在尝试复制 Read PureScript by Example book 中的示例。

我收到此错误:

Could not match type

  Error

with type

  ErrorEvent

这是我一直用来尝试制作该示例的 POC 的代码。

import Prelude
import Control.Monad.Eff
import Control.Monad.Eff.Console (CONSOLE, log)
import Control.Monad.Eff.Exception (EXCEPTION, Error, throwException, catchException, error)
import DOM.HTML.Event.ErrorEvent (message)

grumpyGills :: forall eff. Boolean -> Eff (err :: EXCEPTION | eff) String
grumpyGills ateVegetables = if (ateVegetables)
                            then pure("Good Boy")
                            else throwException (error "Eat your vegetables")

main = do
  test <- catchException handle $ grumpyGills true
  log test

  where
    handle e = do
      log (message e)
      pure("oh well")

问题与此示例基本相同,除了我在尝试使用发布的代码时遇到相同的编译错误:。我看不出我在做什么不同。

我可以看到 ErrorEvent and Error are different. I can also see that catchException 的类型需要一个 Error,因此编译失败。我只是看不出我做错了什么,以及如何解决它。

使用:

我发现我用错了message

我应该一直在使用 message imported from here。 (Control.Monad.Eff.Exception)

不是这个 message (DOM.HTML.Event.ErrorEvent)

注意类型签名不同..derp.

固定导入如下所示:

import Prelude
import Control.Monad.Eff
import Control.Monad.Eff.Console (CONSOLE, log)
import Control.Monad.Eff.Exception (EXCEPTION, Error, throwException, catchException, error, message)
-- import DOM.HTML.Event.ErrorEvent (message) -- Don't import message from here!

我有第二个问题:

Could not match type
                    
  ( err :: EXCEPTION
  )                 
                    
with type
                      
  ( console :: CONSOLE
  , err :: EXCEPTION  
  | t0                
  )  

我通过在我的 grumpyGills 类型定义中添加可扩展的效果来解决这个问题。

grumpyGills :: forall eff. Boolean -> Eff (err :: EXCEPTION | eff) String

这也行得通:

grumpyGills :: Boolean -> Eff (err :: EXCEPTION, console :: CONSOLE) String