如何从Haskell中的子线程打印错误?

时间:2017-07-06 14:17:43

标签: haskell

给出以下代码:

module Main where

import Control.Concurrent

main :: IO ()
main = forkIO errorPrinter >> threadDelay 1000000 >> print "Finished"

errorPrinter = error "You can't see me!"

我希望,运行此代码后我会看到:

"You can't see me"
"Finished!"

打印到控制台。但是,“你看不到我”从未打印过。

我意识到在生产代码中使用错误并不是一个好主意,但我在开发中使用它并且我发现没有错误打印到控制台 - 甚至是依赖项引发的错误。

我确信这个问题很简单。我不能成为第一个遇到这个问题的人,但我无法在任何地方找到答案。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

我无法重现你的问题;对我来说,它打印出“你看不到我!”:

% runhaskell test.hs
test.hs: You can't see me!
CallStack (from HasCallStack):
  error, called at test.hs:8:16 in main:Main
"Finished"

我看到GHC 7.6(我躺在最古老的GHC)之前的行为类似;我会有点惊讶地发现,在过去的二十多年里,这种行为发生了很大的变化。

无论如何,我建议切换到打印你想要打印的信息:

import System.IO
errorPrinter = hPutStrLn stderr "You can't see me!"

说出你的意思,以及所有这些。