是否有可能从提示中的错误eval中恢复?

时间:2015-10-14 15:48:35

标签: haskell error-handling interpreter either

我正在尝试使用hint中的hackage包来创建一个简单的环境,用户可以在其中发布用于评估的代码行(例如在ghci中)。我希望一些输入行是错误的(eval将以错误结束会话)。如何创建一个忽略错误输入的强健会话(或者更好:它报告错误但可以接受其他输入)并保持先前​​的一致状态?

另外,我想以do样式使用它,即let a = 3,因为独立的输入行是有意义的。

澄清事情:我对单eval没问题。我想做的是,即使在一些步骤失败后也允许继续评估。此外,我想逐步扩展monadic链(就像你在ghci中所做的那样)。

换句话说:我想要这样的内容,除了我评估3并且不会因错误而停在undefined

runInterpreter $ setImports [ "Prelude" ] >> eval "undefined" >> eval "3"

更具体地说,我想这样的事情是可能的:

runInterpreter $ setImports ... >> eval' "let a = (1, 2)" -- modifying context
                                >> typeOf "b" -- error but not breaking the chain
                                >> typeOf "a" -- (Num a, Num b) => (a, b)

我不希望它直截了当地工作,这只是为了表明这个想法。我基本上想建立一些上下文(就像你在ghci中所做的那样),只有在没有失败的情况下,每次添加上下文都会修改它,在每次尝试修改上下文后都可以记录或显式检索失败。

1 个答案:

答案 0 :(得分:1)

您没有显示任何代码,所以我不知道问题。我使用提示的最直接的方法处理错误:

import Language.Haskell.Interpreter
let doEval s = runInterpreter $ setImports ["Prelude"] >> eval s

为我带来了精彩的输出......

Prelude Language.Haskell.Interpreter> doEval "1 + 2"
Right "3"
Prelude Language.Haskell.Interpreter> doEval "1 + 'c'"

<击>

<击>
ghc: panic! (the 'impossible' happened)
  (GHC version 7.10.2 for x86_64-apple-darwin):
        nameModule doEval_a43r

......除了现在不可能发生......这是一个错误。请注意,您应该在以下情况下获得Left someError

data InterpreterError
  = UnknownError String
  | WontCompile [GhcError]
  | NotAllowed String
  | GhcException String
        -- Defined in ‘hint-0.4.2.3:Hint.Base’

您是否查看了ghchq错误列表和/或提交了问题?

编辑:

正确的功能又回来了,至少在OS X上使用提示版本0.4.2.3的GHC 7.10.3 x64。换句话说,它似乎从7.10.2到7.10.3

输出结果为:

  

左(WontCompile [GhcError {errMsg =“:3:3:\ n]因使用\ 8216+ \ 8217而没有(Num Char)实例\ n在表达式中:1 +'c'\ n In \ 8216e_11 \ 8217的等式:e_11 = 1 +'c'\ n在\ 8216show_M439719814875238119360034 \ 8217的第一个参数中,即\ n \ 8216(在e_11中让e_11 = 1 +'c')\ 8217“}])

尽管在GHCi中执行doEval两次确实会导致恐慌,但是在解释器中似乎只能运行一次,无论编译时是什么。