【发布时间】: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 + $!) 以及添加 Strict 和 StrictData 编译指示,但是我仍然得到不一致的行为。
{-# 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