2016-08-13 92 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輸出。