2016-08-13 52 views
1

正如标题所示,出于某种原因,调试函数时,传递给trace(以及其变体)函数的消息不能正确显示。简单地刷新stdout/stderr似乎也没有做任何事情。Frege trace not printing

-- 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未使用第二个参数,因此trace未被调用。您可以使用seq或模式匹配。

如果更改debug功能如下:

debug msg f = trace msg `seq` f 

,或者这样:

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

它仍然不会,如果你改变main刷新stderr打印任何东西,因为这样冲洗:

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

它会工作,我牛逼打印所有的调试消息结尾:

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输出。