Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging Haskell将跟踪重定向到文件_Debugging_Haskell_Functional Programming - Fatal编程技术网

Debugging Haskell将跟踪重定向到文件

Debugging Haskell将跟踪重定向到文件,debugging,haskell,functional-programming,Debugging,Haskell,Functional Programming,所以在这里,我试图找出如何将代码中可能出现的任何异常记录到日志文件中。首先我注意到trace函数,但后来我发现它只输出到stdin 然后我看到了logger模块,但它运行在IO monad内部,所以这有点麻烦,因为它会牺牲纯度和所有。然后我想,在我的例子中,若我创建了一个参数类型为IO()的函数a->b->b,一切都会好起来 事实上,编译器没有发现它有任何问题,但遗憾的是,append从未真正调用过,所以我仍然回到了基础。我真正想知道的是: a) 是否有任何函数在执行IO的同时仍然具有纯签名(如

所以在这里,我试图找出如何将代码中可能出现的任何异常记录到日志文件中。首先我注意到trace函数,但后来我发现它只输出到stdin

然后我看到了logger模块,但它运行在IO monad内部,所以这有点麻烦,因为它会牺牲纯度和所有。然后我想,在我的例子中,若我创建了一个参数类型为IO()的函数a->b->b,一切都会好起来

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

提前谢谢你们

然后我想,在我的例子中,若我创建了一个参数类型为IO()的函数a->b->b,一切都会好起来

不,错了。即使您“评估”第一个参数,这也不会起任何作用。如果没有
unsafePerformIO
,则无法实现
trace

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

但不清楚--
跟踪
输出到stderr。有什么理由你不能这么做吗

./MyHaskellExecutable 2>dumpStdErrToThisFile

日志记录会产生副作用,因此必须在一些monad中才能产生这种效果。否则,编译器可能会优化掉语义上不必要的日志调用

如果您正在构建一个计划支持日志记录的应用程序,则需要在某种日志记录环境中运行它
IO
有些过分,但也许更简单的
Log
monad更合适(有点像一个神奇的
Writer
,具有类似于
ST
的本地封装属性)