私は、Uniが単純な命令型言語用のコンパイラー(Haskellで)を作成するプロジェクトを持っています。要件の1つは、関数呼び出しの開始、関数の終了、および変数の割り当て時にデバッグステートメントを出力することです。
関数を入力するときにメッセージを印刷するのは簡単です。私はDebug.traceを使用します。例:
functionValue = trace "Entering function" (evaluateFunction functionArguments)
変数に割り当てる場合も同じプロセスが適用されます。私が理解できないのは、関数呼び出しから戻ったときに印刷し、出力を他の出力と正しくタイミングを合わせる方法です。これまでに行ったすべての試みの結果、「関数の開始」の直後に「関数の終了」が出力されました。「関数の終了」を出力する前に、関数の内部デバッグステートメント(関数の割り当てとネストされた呼び出し)を出力する必要があります。
私の命令型の習慣は、leave-function出力の前に(evaluateFunction functionArguments)の実行を強制する方法が必要であることを教えてくれますが、これはHaskellでは不可能で間違っているようです。
私が今得た出力例:
Entering main function...
Leaving main function...
Entering fn1 function...
Leaving fn1 function...
Assigning value1 to A.
Assigning value2 to C.
Entering fn2 function...
Leaving fn2 function...
Assigning value3 to B.
Assigning value4 to C.
同じプログラムの出力は、私が必要とする方法で表示されます。
Entering main function...
Entering fn1 function...
Assigning value1 to A.
Leaving fn1 function...
Assigning value2 to C.
Entering fn2 function...
Assigning value3 to B.
Assigning value4 to C.
Leaving fn2 function...
Leaving main function...
では、「myFunctionWithTracesを実行してからmyStringを出力する」のHaskellイディオムは何ですか?