2

hintパッケージを使用hackageして、ユーザーが評価用のコード行を発行できる単純な環境を作成しようとしています(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 \8216+\8217\n の使用に起因する (Num Char) のインスタンスはありません\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この行を 2 回実行すると panic が発生しますが、インタプリタで 1 回実行するとコンパイル時に関係なく正しく動作するようです。

于 2015-10-14T19:07:13.563 に答える