我正在尝试使用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中所做的那样),只有在没有失败的情况下,每次添加上下文都会修改它,在每次尝试修改上下文后都可以记录或显式检索失败。
答案 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
行两次确实会导致恐慌,但是在解释器中似乎只能运行一次,无论编译时是什么。