在下面的模块中,函数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))
答案 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"
}