Как справиться с «паникой: невозможное случилось» и продолжить в Haskell - PullRequest
7 голосов
/ 11 февраля 2012

У меня есть следующий код, который использует GHC API для загрузки модулей и получения типа выражения:

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

Если выражения не проходят проверку типов, вся программа завершается с ошибкой:

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]'

Как мне сделать так, чтобы программа не вызывала сбой программы?Я просто хочу знать, какой тип выражения успешно проверен, а какой нет.

1 Ответ

12 голосов
/ 03 мая 2012

Вы не можете справиться с этим - это похоже на ядро ​​«упс» и означает, что среда выполнения или компилятор находятся в несовместимом состоянии.Сообщите об этом как об ошибке.

...