hal*_*leo 0 haskell wait pure-function pause
在一个我不太了解的 Haskell 程序中,我想要一个函数
myInfo :: Int -> Picture
myInfo mode =
...
Run Code Online (Sandbox Code Playgroud)
总是比正常情况多花 2 秒(以减慢输出速度)。
我查了一下Control.Concurrent.threadDelay
,但由于它的签名,我无法弄清楚如何将它放在定义threadDelay :: Int -> IO ()
函数的程序的纯部分中。myInfo
是否可以myInfo
在不将函数带入 Haskell 程序的不纯区域的情况下减慢速度(例如 2 秒)?
该解决方案不需要具有生产性能。(这只是为了更好地理解程序的自动运行而采取的临时措施。)
排序 \xe2\x80\x93 如果这是为了调试,你可以将其作为
\nmyInfo mode = unsafePerformIO $ do\n threadDelay 2000000\n return $ actualImplementationOfMyInfo mode\n
Run Code Online (Sandbox Code Playgroud)\n然而,虽然这有时对于调试/测试性能下降的行为有用,但请记住,GHC 假设函数是引用透明的,因此您不能依赖此行为。
\n例如,如果你有类似的东西
\nmode = SomeMode\n...\n\nf (myInfo mode)\n\n...\n\ng (myInfo mode)\n
Run Code Online (Sandbox Code Playgroud)\nGHC 很可能会决定,因为对 的两次调用myInfo
是相同的,所以只评估一次并稍后重用结果。如果您需要可预测的基于时间/顺序的行为,您将不可避免地必须以某种方式将逻辑放入 IO 中。