2017-07-06 4 views
4

:コンソールに出力Haskellの子スレッドからエラーをどのように出力しますか?次のコードを考える

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

module Main where 

import Control.Concurrent 

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

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

を、私はこのコードを実行している時に、私はこれを見るだろうと、期待します。しかし、「あなたは私を見ることができない」という言葉は決して印刷されません。

プロダクションコードではエラーを使用するのは良い考えではありませんが、私はそれを開発に使用していますが、コンソールにはエラーは表示されません。

この問題には簡単な解決策があると確信しています。私はこの問題を抱える最初の人になることはできませんが、どこでも答えは見つけられません。

ご協力いただければ幸いです。

+1

メインスレッドが終了すると、他のスレッドはすべて終了します。メインスレッドは、もう一方のスレッドを待機させる必要があります。ソリューションについては、[プログラム]の終了について[docs](http://hackage.haskell.org/package/base-4.9.1.0/docs/Control-Concurrent.html#g:12)を確認してください。 – chi

+0

助けてくれてありがとう。あなたはthreadDelayへの呼び出しに気付きましたか?私はそれが完了するために子スレッドを許可するのに十分長いメインスレッドを一時停止する必要がありますと思う。 –

+0

そうです、遅延がなぜ役に立たないのか分かりません。 – chi

答えて

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)と同様の動作を参照してください。私は、この行動が過去20年ほどで大きく変化したことを知るために、少し驚くだろう。

とにかく、私はあなたが印刷するメッセージを印刷するに切り替えることをお勧めします:

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

はあなたが何を意味するかと言うと、すべてのこと。

+0

アドバイスをいただきありがとうございます。問題は、依存関係の他のエラーも印刷されないことです。私はあなたのイディオムを印刷エラーのために使用します。 これはいくつかの異なるプロジェクトで発生するため、これはむしろ奇妙です。私は本当に私がプロジェクトを管理するためにスタックを使用していることに言及する価値があるとは思っていませんでしたが、多分私はその道を調査すべきです... –

+3

...それは私が持っている必要があることが判明! ghcでコンパイルしてもスタックではコンパイルできません。 OK、もう一度あなたの助けてくれてありがとう - 私はこれをもう少し詳しく見ていきます。 –

関連する問題