我可以让一个纯 Haskell 函数等待 2 秒吗?

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 秒)?

该解决方案不需要具有生产性能。(这只是为了更好地理解程序的自动运行而采取的临时措施。)

Cub*_*bic 6

排序 \xe2\x80\x93 如果这是为了调试,你可以将其作为

\n
myInfo mode = unsafePerformIO $ do\n  threadDelay 2000000\n  return $ actualImplementationOfMyInfo mode\n
Run Code Online (Sandbox Code Playgroud)\n

然而,虽然这有时对于调试/测试性能下降的行为有用,但请记住,GHC 假设函数是引用透明的,因此您不能依赖此行为。

\n

例如,如果你有类似的东西

\n
mode = SomeMode\n...\n\nf (myInfo mode)\n\n...\n\ng (myInfo mode)\n
Run Code Online (Sandbox Code Playgroud)\n

GHC 很可能会决定,因为对 的两次调用myInfo是相同的,所以只评估一次并稍后重用结果。如果您需要可预测的基于时间/顺序的行为,您将不可避免地必须以某种方式将逻辑放入 IO 中。

\n