私は大学のプロジェクトとして単純な言語のインタープリターを書いていますが、いくつかのデバッグ機能を書き込むオプションがあります。これは簡単だと思っていましたが、フラストレーションのために約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 はどうですか?
注: より多くの情報を含める必要がある場合は、お知らせください - できるだけ少ない情報から始めたので、不必要な情報で過負荷にならないようにしています。