2

ここで、コード内で発生する可能性のある異常をログファイルに記録する方法を見つけようとしていました。最初に trace 関数に気付きましたが、 stdin にしか出力されないことがわかりました。

次に、 logger モジュールが表示されますが、これは IO モナド内で実行されるため、純度とすべてを妥協することで少し面倒です。次に、私の場合、タイプ IO () の a パラメータを使用して関数 a->b->b を作成すれば、すべて問題ないと考えました。

実際、コンパイラは何も問題を認識していませんでしたが、残念ながら、追加が実際に呼び出されることはなかったため、基本に戻っていました。私が実際に知りたいのは次のとおりです:a) ロギングに役立つ純粋な署名(unsafePerformIOなど)を持ちながらIOを実行する関数はありますかb)コンパイラに最初のパラメータを評価させる方法はありますか?実際に使用したことがないのに構築した機能は?

よろしくお願いします

4

2 に答える 2

9

次に、私の場合、タイプ IO () の a パラメータを使用して関数 a->b->b を作成すれば、すべて問題ないと考えました。

いいえ、違います。最初の引数を「評価」しても、これは何もしません。なしでは実装できません。traceunsafePerformIO

IO値は単なる値であり、それ以上ではありません。の実行中にmain(または が原因でunsafePerformIO) 発生した場合にのみ、実際に実行されます。

ただし、明確ではありませんtrace-stderrに出力します。できない理由があるの?

./MyHaskellExecutable 2>dumpStdErrToThisFile
于 2012-05-31T14:14:38.777 に答える
5

ロギングは副作用があるため、その効果のためにいくつかのモナドにある必要があります。そうしないと、コンパイラが意味的に不要なロギング呼び出しを最適化する危険があります。

ロギングをサポートする計画でアプリを構築している場合は、何らかのロギング環境でアプリを実行する必要があります。IOやり過ぎですが、おそらくより単純なLogモナドの方が適切でしょう(ローカルカプセル化のような魔法のようなものです)WriterST

于 2012-05-31T14:44:27.517 に答える