在Haskell中如何睡眠或延迟线程?

17

寻找答案真的不应该这么难,但是我找不到... 我想延迟在一个do块中的下一步执行。我找到了以下函数:delaysleepnanosleepusleep

还有这个问题,它没有说明如何使用任何一个函数:Sleep in Haskell

对于所有这些函数,我都得到了相同的错误,所以可能我从根本上做错了什么:

Variable not in scope: delay :: Integer -> IO a0

这是我的测试片段:

main = do
  {
    putStrLn "line 1"
  ; delay 2
  ; putStrLn "line 2"
  }

不知何故,谷歌搜索该错误实际上并没有得到任何有用的结果。

1个回答

31

好的,你需要先导入 Control.Concurrent

import Control.Concurrent

threadDelay 1000000 --sleep for a million microseconds, or one second

1
好的,错误信息并不是很有用。我期望看到类似于“未知符号‘delay’”的提示……实际上,它似乎知道这个符号,因为它知道函数的签名。那么为什么我还需要导入定义呢?另外……如果我想使用实际的delay函数而不是threadDelay,我需要导入什么? - lo tolmencre
10
因为类型推断,它知道类型。虽然所需签名的函数不存在,因此会收到错误消息。然后,delay函数是非标准的,需要安装一个名为concurrent-extra的第三方包,如链接所示。然后,您需要import Control.Concurrent.Thread.Delay即可使用。我不确定为什么需要特定的函数,因为在Haskell中挂起程序执行的标准方法是使用threadDelay - ForceBru
@ForceBru 当我第一次开始寻找延迟函数时,出现的第一个搜索词是这个额外的包,我错误地使用了一段时间,直到意识到在Control.Concurrent中有一个版本。所以可能只是搜索引擎找错了东西。 - Zpalmtree

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接