2

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

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


澄清一下:我对单个eval. 我想做的是,即使在某些步骤失败后也允许继续评估。我还想逐步扩展一个单子链(就像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 中所做的那样),并且只有在没有失败的情况下,对上下文的每次添加都会修改它,每次尝试修改上下文后都可以记录或显式检索失败。

4

1 回答 1

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 上的 GHC 7.10.3 x64 开始,提示版本为 0.4.2.3。换句话说,这个错误似乎从 7.10.2 到 7.10.3

输出是:

Left (WontCompile [GhcError {errMsg = ":3:3:\n 没有实例 for (Num Char) 由于使用 \8216+\8217\n 在表达式中:1 + 'c'\n 在等式中\8216e_11\8217: e_11 = 1 + 'c'\n 在\8216show_M439719814875238119360034\8217的第一个参数中,即\n \8216(let e_11 = 1 + 'c' in e_11)\8217"}])

尽管在 GHCi 中执行该doEval两次确实会导致恐慌,但事情似乎在解释器中工作一次并且无论何时编译都正常。

于 2015-10-14T19:07:13.563 回答