Debugging Haskell将跟踪重定向到文件
所以在这里,我试图找出如何将代码中可能出现的任何异常记录到日志文件中。首先我注意到trace函数,但后来我发现它只输出到stdin 然后我看到了logger模块,但它运行在IO monad内部,所以这有点麻烦,因为它会牺牲纯度和所有。然后我想,在我的例子中,若我创建了一个参数类型为IO()的函数a->b->b,一切都会好起来 事实上,编译器没有发现它有任何问题,但遗憾的是,append从未真正调用过,所以我仍然回到了基础。我真正想知道的是: a) 是否有任何函数在执行IO的同时仍然具有纯签名(如unsafePerformIO),可以帮助我进行日志记录 b) 有没有办法强迫编译器计算我构建的函数中的第一个参数,即使我从未实际使用过 提前谢谢你们 然后我想,在我的例子中,若我创建了一个参数类型为IO()的函数a->b->b,一切都会好起来 不,错了。即使您“评估”第一个参数,这也不会起任何作用。如果没有Debugging Haskell将跟踪重定向到文件,debugging,haskell,functional-programming,Debugging,Haskell,Functional Programming,所以在这里,我试图找出如何将代码中可能出现的任何异常记录到日志文件中。首先我注意到trace函数,但后来我发现它只输出到stdin 然后我看到了logger模块,但它运行在IO monad内部,所以这有点麻烦,因为它会牺牲纯度和所有。然后我想,在我的例子中,若我创建了一个参数类型为IO()的函数a->b->b,一切都会好起来 事实上,编译器没有发现它有任何问题,但遗憾的是,append从未真正调用过,所以我仍然回到了基础。我真正想知道的是: a) 是否有任何函数在执行IO的同时仍然具有纯签名(如
unsafePerformIO
,则无法实现trace
IO
值只是值,不再是值。只有当它们发生在执行main
的过程中(或由于unsafePerformIO
)时,它们才被实际执行
但不清楚--跟踪
输出到stderr。有什么理由你不能这么做吗
./MyHaskellExecutable 2>dumpStdErrToThisFile
日志记录会产生副作用,因此必须在一些monad中才能产生这种效果。否则,编译器可能会优化掉语义上不必要的日志调用 如果您正在构建一个计划支持日志记录的应用程序,则需要在某种日志记录环境中运行它
IO
有些过分,但也许更简单的Log
monad更合适(有点像一个神奇的Writer
,具有类似于ST
的本地封装属性)