2014-08-25 4 views
2

В настоящее время я пытаюсь скомпилировать симулятор, созданный с помощью ghc 7.6.3, с новым ghc 7.8.3 и столкнулся с проблемой с GHC.Event.Таймауты с ghc 7.8.3

Я использую функции таймаута, которые изменились с помощью 7.8.3. В 7.8.3 теперь имеется глобальная функция getSystemTimerManager, которая возвращает TimerManager. Но тип данных TimerManager не экспортируется, он является частью скрытого пакета GHC.Event.TimerManager. Когда я пытаюсь импортировать этот модуль я получаю:

Utils/Timer.hs:16:8: 
    Could not find module ‘GHC.Event.TimerManager’ 
    it is a hidden module in the package ‘base’ 
    Use -v to see a list of the files searched for. 

В чем причина, что этот модуль скрыт, так что не могут быть использованы функции таймера?

+0

Вы используете 'cabal' для сборки? Возможно, вам придется добавить 'base' в раздел' build-depends' вашего файла cabal. –

+1

У вас не должно быть доступа к 'TimerManager', это похоже на тип' IO', он скрыт для предотвращения злоупотреблений. Вместо этого 'GHC.Event' экспортирует' registerTimeout', 'unregisterTimeout' и' updateTimeout' для выполнения операций таймаута. – bheklilr

+1

@JustinWood Добавление 'base' в' build-depends' не будет исправлено, модуль 'GHC.Event.TimerManager' скрыт, то есть он вообще не экспортируется' base'. GHC намеренно сделал этот модуль недоступным для предотвращения злоупотребления его содержимым. – bheklilr

ответ

3

Хотя тип не экспортируется, все это означает, что вы не можете записать подпись типа, которая упоминает ThreadManager. Вы все равно можете позвонить по телефону registerTimeout, updateTimeout или unregisterTimeout.

Пример:

module Main where 

import GHC.Event 
import Control.Concurrent (threadDelay) 

main = do 
    tm <- getSystemTimerManager 
    _ <- registerTimeout tm 100000 $ do 
    putStrLn "timeout!" 
    putStrLn "sleeping" 
    threadDelay 200000 
    putStrLn "wokeup" 

Это компилируется и работает и печатает "sleeping\ntimeout!\nwokeup".

Что бы не сработало, чтобы попытаться записать тип tm. Иногда это может раздражать, если вы хотите использовать диспетчер таймера в некоторой структуре данных. Но я думаю, вы не должны это делать.

+0

А, ок, я вижу. Хорошо, тогда мне нужно немного перепроектировать ... Спасибо! – MichaelO

Смежные вопросы