弗雷格跟踪不打印

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 在调用函数时自动刷新它。