【问题标题】:How can I force debug trace statements to evaluate in order?如何强制调试跟踪语句按顺序评估?
【发布时间】:2018-12-01 13:18:30
【问题描述】:
import Debug.Trace

main  :: IO ()
main = do
  let b = (fff 2 10)
  print b
  let c = (fff 3 10)
  print c
  print "---"


ff :: (->) Int Int
ff = do
  x <- traceShow "x is: " . traceShowId
  pure $ (x)

fff :: Int -> Int -> Int
fff = do
  (-) . ff

跟踪函数似乎是延迟评估的,或者意味着输出可能会有所不同:

"x is: "
2
-8
"x is: "
-7
3
"---"

在另一次运行中:

"x is: "
2
"x is: "
3
-8
-7
"---"

我已经尝试过这里的建议:How do I force evaluation of an IO action within `unsafePerformIO`? (BangPatterns Pragma + $!) 以及添加 StrictStrictData 编译指示,但是我仍然得到不一致的行为。

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE Strict #-}
{-# LANGUAGE StrictData #-}

import Debug.Trace

main  :: IO ()
main = do
  let !b = (fff 2 10)
  print b
  let !c = (fff 3 10)
  print c
  print "---"

ff :: (->) Int Int
ff = do
  x <- id $! (traceShow "x is: " . traceShowId)
  pure $ (x)

fff :: Int -> Int -> Int
fff = do
  (-) . ff

我也尝试过使用unsafePerformIo,但这有类似的行为:

hmm :: a -> a
hmm x = unsafePerformIO $! do
  pure x

ff :: Int -> Int
ff z = do
  hmm (trace "x is: " . traceShowId) $ z 

是否有无需了解严格性/Haskell 评估的解决方案?

【问题讨论】:

    标签: debugging haskell io lazy-evaluation trace


    【解决方案1】:

    Debug.Trace 函数打印到stderr,因此可以预期交错。

    至少,您可以将x 和它前面的字符串放在一起,以将其与其他print 输出区分开来。

    ff :: Int -> Int
    ff x = trace ("x is: " ++ show x) x
    

    您还可以使用unsafePerformIO 重新定义打印到stdout 的跟踪函数以强制执行某些排序。

    【讨论】:

      【解决方案2】:

      听起来您正在处理缓冲问题。您可以使用hFlush 或只设置缓冲:

      hSetBuffering stderr NoBuffering
      hSetBuffering stdout NoBuffering
      

      【讨论】:

      • 感谢您的建议 - 但似乎不起作用。
      【解决方案3】:
      myTrace :: Show a => a -> a
      myTrace x = unsafePerformIO $ do
        print x
        pure x
      

      以上似乎运作良好。感谢https://stackoverflow.com/users/6863749/li-yao-xia

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        相关资源
        最近更新 更多