Haskell 如何处理;恐慌:不可能的事情发生了”;继续在哈斯克尔
我有以下使用GHC API加载模块并获取表达式类型的代码:Haskell 如何处理;恐慌:不可能的事情发生了”;继续在哈斯克尔,haskell,dynamic-loading,typechecking,ghc-api,Haskell,Dynamic Loading,Typechecking,Ghc Api,我有以下使用GHC API加载模块并获取表达式类型的代码: typeObjects :: [String] -> [String] -> IO [Type] typeObjects modules objects = do defaultErrorHandler defaultDynFlags $ do runGhc (Just libdir) $ do dflags <- getSessionDynFlags setSessionDynFl
typeObjects :: [String] -> [String] -> IO [Type]
typeObjects modules objects = do
defaultErrorHandler defaultDynFlags $ do
runGhc (Just libdir) $ do
dflags <- getSessionDynFlags
setSessionDynFlags dflags
targets <- mapM ((flip guessTarget) Nothing) modules
setTargets targets
result <- load LoadAllTargets
case result of
Failed -> error "Compilation failed"
Succeeded -> do
m <- mapM (((flip findModule) Nothing) . mkModuleName) modules
setContext m []
values <- mapM exprType objects
return values
我怎样才能使它不会使程序崩溃?我只想知道哪些表达式类型检查成功,哪些未成功。您无法处理它-这就像内核“oops”,意味着运行时或编译器处于不一致的状态。将其报告为错误。如果您设法使编译器崩溃,则是编译器错误。检查这是否是一个已知的错误,否则报告它。我不认为这是一个错误。没错。我试图在运行时编译一个表达式,该表达式试图在需要Int的地方传入字符串。我只想“抓住”那个错误并“标记”那个表达式是失败的,而其他不会造成错误的,我会认为是成功的。@桃树报告错误是正确的行为。用“恐慌!(不可能的事情发生了)”撞车是不正确的行为。将其报告为bug。
TestDynamicLoad: panic! (the 'impossible' happened)
(GHC version 7.0.3.20110330 for x86_64-unknown-linux):
Couldn't match expected type `GHC.Types.Int'
with actual type `[GHC.Types.Char]'