2016-08-13 13 views
1

タイトルが何らかの理由で、trace(まあ、その変種)関数に渡されたメッセージは、デバッグ機能のときに正しく表示されません。単にstdout/stderrをフラッシュしても何もしないようです。フレージトレースが印刷されない

-- Makes it more like Haskell's trace 
debug :: String -> α -> α 
debug msg f = const f $ trace msg 

-- dummy function 
polyA :: (Num α) => α 
polyA = debug "polyA\n" 0 

-- another dummy function 
polyB :: (Num α) => α 
polyB = debug "polyB\n" polyA 

main :: IO() 
main = do println (polyB :: Int ) 
      println (polyB :: Int ) 
      println (polyB :: Integer) 

出力はちょうど

0 
0 

(通常、Eclipseのコンソールに赤い文字で表す)標準エラー出力に表示何もです。

答えて

2

constは第2引数を使用しないため、traceは呼び出されません。 seqまたはパターンマッチを使用できます。

あなたはこれにdebug機能を変更する場合:

debug msg f = trace msg `seq` f 

またはこれに:

debug msg f | trace msg = undefined 
      | otherwise = f 

あなたがstderrをフラッシュするmainを変更するので、もしそれがまだ紅潮のために何も印刷されません:

main :: IO() 
main = do println (polyB :: Int ) 
      println (polyB :: Int ) 
      println (polyB :: Integer) 
      stderr.flush 

tは最後に、すべてのデバッグメッセージを出力します。

frege> main 
0 
0 
0 
polyA 
polyB 
polyA 
polyB 
polyA 
polyB 
() 

インゴが述べたように、我々はまた、関数が呼び出されたとき、それは自動的にフラッシュ持つことtraceLnを使用することができます。

+0

「traceLn」を使用して「リアルタイム」で印刷することもできます – Ingo

+0

@Ingoはい、ありがとう!私はそれを含める答えを更新しました.. –

1

私はにdebugを変更:

debug :: String -> α -> α 
debug msg f = if trace msg then f else f 

とstderrに照射出力を得ました。

関連する問題