1

私は大学のプロジェクトとして単純な言語のインタープリターを書いていますが、いくつかのデバッグ機能を書き込むオプションがあります。これは簡単だと思っていましたが、フラストレーションのために約1週間休憩した後、これに対処するために戻ってきました.

haskell ファイル全体は約 250 行なので、すべてを掲載したくはありませんが、十分な情報を提供していない場合はお知らせください。

私はこの機能を持っています

interpret_statement :: Prog -> (Var -> Val -> Vars -> o) -> Vars -> Stmt -> o

ここで (Var -> Val -> Vars -> o) はデバッグ関数です - 私が選択した 2 つの可能性のうちの 1 つです

pure_passthrough :: Var -> Val -> Vars -> Vars -- does no IO
write_debugging_info :: Var -> Val -> Vars -> IO Vars -- does IO

私は別の機能も持っています

interpret_function :: Prog -> (Var -> Val -> Vars -> o) -> Vars -> [Stmt] -> Val

行を含む

interpret_function prog debug_function vars (x:xs) = interpret_function prog debug_function (interpret_statement prog debug_function vars x) xs 

そして、それを言って固定型エラーを私に与える3行のうちの1つです

Expected type: Var -> Val -> Vars -> Vars
Actual type: Var -> Val -> Vars -> o

IO を導入する前は、すべてが完全に正常に機能していました。コマンドライン引数を受け取るかどうかに応じて、実行時に IO を実行するかどうかをプログラムに伝えるために多態性関数を使用することを提案した、このサイトの別の質問の回答により、この方法で実行しました。

しかし、多相変数をやり取りする必要がある相互依存関数がいくつかあるため、問題が発生しますか? ああ、人間性!私はHaskellの連中が上手になっていると本当に思っていますが、これには完全に困惑しています。「実際の型」 Var -> Val -> Vars -> o はどうですか?

注: より多くの情報を含める必要がある場合は、お知らせください - できるだけ少ない情報から始めたので、不必要な情報で過負荷にならないようにしています。

4

1 に答える 1

4

呼び出し(interpret_statement prog debug_function vars x)は返さなければならない位置にあります。Vars型を返すことはできませんo

ではinterpret_function、戻り値の型は に依存しないoため、IO モナドを返すデバッグ関数を渡しても、 の結果は IO モナドになりinterpret_functionません。

私の Haskell は少し錆びていますがinterpret_function、その型が になるように変更できると思います

interpret_function :: (Monad m) => Prog -> (Var -> Val -> Vars -> m Vars) -> Vars -> [Stmt] -> m Val

wheremは、IOまたはいくつかの自明なモナド (おそらく this one ) のいずれかになります。

その特定のケースの実装は次のようになります。

interpret_function prog debug_function vars (x:xs) =
  do vars' <- interpret_statement prog debug_function vars x
     return $ interpret_function prog debug_function vars' xs
于 2013-04-20T15:50:01.017 に答える