2

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

然后我看到了记录器模块,但是它在 IO monad 内部运行,所以它有点麻烦,因为它会损害纯度和所有东西。然后我想,如果我创建了一个函数 a->b->b,并且在我的情况下,a 参数的类型为 IO () 一切都会好的。

事实上,编译器并没有发现任何问题,但遗憾的是,append 从未真正被调用过,所以我仍然回到了基础。我真正想知道的是:a)是否有任何函数在执行 IO 的同时仍然具有纯签名(如 unsafePerformIO)可以帮助我进行日志记录 b)有没有办法强制编译器评估第一个参数即使我从未真正使用过我构建的功能?

提前谢谢你们

4

2 回答 2

9

然后我想,如果我创建了一个函数 a->b->b,并且在我的情况下,a 参数的类型为 IO () 一切都会好的。

不对,错了。即使您“评估”第一个参数,这也无济于事。没有. _ _ trace_unsafePerformIO

IO价值观只是价值观,仅此而已。只有当它们发生在执行main(或由于unsafePerformIO)的过程中时,它们才真正被执行。

不过还不清楚——trace输出到stderr。有没有理由你不能做

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

记录是有副作用的,所以必须在一些单子中才能产生这种效果。否则会冒着编译器优化你语义上不必要的日志调用的风险。

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

于 2012-05-31T14:44:27.517 回答