弗雷格跟踪不打印
Frege trace not printing
正如标题所说,由于某些原因,传递给 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
stderr 中没有任何可见内容(通常在 Eclipse 的控制台中用红色文本表示)。
我把debug
改成了:
debug :: String -> α -> α
debug msg f = if trace msg then f else f
并将输出发送到 stderr。
由于 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
()
正如 Ingo 提到的,我们还可以使用 traceLn
在调用函数时自动刷新它。
正如标题所说,由于某些原因,传递给 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
stderr 中没有任何可见内容(通常在 Eclipse 的控制台中用红色文本表示)。
我把debug
改成了:
debug :: String -> α -> α
debug msg f = if trace msg then f else f
并将输出发送到 stderr。
由于 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
()
正如 Ingo 提到的,我们还可以使用 traceLn
在调用函数时自动刷新它。