Haskell将跟踪重定向到文件

omu*_*gru 2 debugging haskell functional-programming

所以在这里我试图弄清楚如何将我可能在我的代码中的任何异常记录到日志文件中.首先我注意到跟踪功能,但后来我看到它只输出到标准输入.

然后我看到了记录器模块,但是它在IO monad中运行,所以它有点麻烦什么,妥协纯度和所有.然后我想,如果我做了一个函数a-> b-> b,其中a参数的类型为IO(),在我的情况下,一切都会好的.

事实上,编译器没有看到它有什么问题,但唉,追加从未被实际调用过,所以我仍然回归基础.我其实想知道的是:1)是否有执行IO同时还具有纯签名(如unsafePerformIO),可以帮助我记录B中所述的功能)有什么办法来强制编译器评估第一参数我建立的功能,即使我从未真正使用过?

谢谢你们提前

Lou*_*man 9

然后我想,如果我做了一个函数a-> b-> b,其中a参数的类型为IO(),在我的情况下,一切都会好的.

不,错了.即使您"评估"第一个参数,这也无济于事.你无法实现traceunsafePerformIO.

IO价值只是价值,不再是价值.只有当它们在执行过程中main(或由于它们)发生时才会unsafePerformIO实际执行.

但不清楚 - trace输出到stderr.有没有理由不能做到

./MyHaskellExecutable 2>dumpStdErrToThisFile
Run Code Online (Sandbox Code Playgroud)


Don*_*art 5

记录是副作用,因此必须在某些monad中为此效果.否则,冒着编译器优化您的语义上不必要的日志记录调用的风险.

如果您正在构建一个支持日志记录计划的应用程序,则需要在某种日志记录环境中运行它.IO可能是矫枉过正,但也许一个更简单的Logmonad更合适(一种神奇的Writer,具有ST局部封装的类似属性).