catchException不会删除效果

时间:2018-02-08 14:02:50

标签: purescript

在下面的模块中,函数g编译时没有注释,但函数f给出消息“无法匹配类型”,并解释为(err :: Exception | e)不匹配()。

但是,throwException和toISOString都会在Eff中返回EXCEPTION效果的值(可能还有其他值)。

看起来好像catchException没有删除f中的EXCEPTION效果,但确实删除了g中的效果。实际上,f的推断类型是:

f :: forall e. DateTime -> Eff (err :: EXCEPTION | e) String

为什么会这样?

module Problem.With.Exception where

import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Exception (catchException, throwException, error)
import Data.DateTime (DateTime(..))
import Data.JSDate (fromDateTime, toISOString)
import Prelude (pure, ($), (<>), show, discard, bind)

g :: DateTime -> Eff () String
g d = catchException
  (\_ -> pure "Some message")
  (throwException $ error "Bla")

-- This is the inferred type for f:
-- f :: forall e. DateTime -> Eff (err :: EXCEPTION | e) String
-- But this is the type I hope for:
f :: DateTime -> Eff () String
f d = catchException
  (\_ -> pure "Some message")
  (toISOString (fromDateTime d))

1 个答案:

答案 0 :(得分:1)

我在一个干净的环境中尝试了它,并且模块按原样编译(具有预期的类型,没有EXCEPTION效果)。 我想你可能有一些库/代码版本的问题。 也许你想做

rm -rf node_modules
rm -rf bower_components
npm install
bower install
pulp build

我在package.json中有以下库版本:

"devDependencies": {
  "bower": "^1.8.2",
  "pulp": "^12.0.1",
  "purescript": "^0.11.7"
}

这些在bower.json

"dependencies": {
  "purescript-prelude": "^3.1.1",
  "purescript-console": "^3.0.0",
  "purescript-exceptions": "^3.1.0",
  "purescript-js-date": "^5.1.0",
  "purescript-datetime": "^3.4.1"
},
"devDependencies": {
  "purescript-psci-support": "^3.0.0"
}