Планирование тайм-аута в Haskell
Я новичок в Haskell, и я пытаюсь выяснить, как запланировать обратный вызов, который будет запущен через X секунд (и не раньше).
В поиске Google и Google я обнаружил:
http://www.haskell.org/ghc/docs/latest/html/libraries/base/GHC-Event.html
а также:
http://hackage.haskell.org/packages/archive/base/4.3.1.0/doc/html/System-Event.html
Оба из них имеют функцию registerTimeout, которая, похоже, делает то, что я хочу. Однако System.Event больше не находится в последних сборках Haskell и GHC.Event помечен как внутренний.
Есть ли какая-нибудь замена для пользовательского пространства, которую я мог бы использовать? Я бы предпочел не использовать функции синхронизации, предназначенные для GLUT (если только этот предписанный способ достижения моей цели), а System.Timeout не кажется совсем тем, чего я хочу; он предназначен для установки максимального количества времени, которое может принять какое-то время, а не минимум.
Спасибо за ваш вклад!
Ответы
Ответ 1
Я просто выполнил бы обратный вызов в своем потоке после задержки. Это GHC-ism.
import Control.Concurrent (forkIO, threadDelay)
-- | Run the callback after the given number of milliseconds.
runAfterDelay :: Int -> IO () -> IO ()
runAfterDelay t f = forkIO (threadDelay t >> f)
Нити в GHC исключительно легки, поэтому это не приведет к связыванию системных ресурсов.