Я пытаюсь написать безопасную функцию оценки времени в Haskell. Код выглядит следующим образомРасходование вычислений тайм-аута Haskell
import System.Timeout
compute, compute' :: Int -> Int
compute i = sum [1..300000 + i]
compute' i = last $ repeat i
timedComp :: Int -> a -> IO (Maybe a)
timedComp timeLeft toCompute =
timeout timeLeft go
where
go = toCompute `seq` return toCompute
main = do
res <- timedComp 10000 (compute 0)
print res
res' <- timedComp 10000 (compute' 0)
print res'
(я знаю, что я только вычисляться WHNF.)
Когда я бегу главный, я получаю только один ничего на выходе, а затем программа зависает. Я попытался скомпилировать и запустить программу многопоточную, но это не помогает. Пробовал как GHC 7.6.3, так и 7.8.3. Какие-либо предложения?
Я боюсь, что 'compute 'i = last $ repeat i' оптимизирован, чтобы вообще не требовать выделения. Если это так, планировщик GHC не имеет возможности переключиться на другой поток Haskell. Это известное «ограничение» (ok, ok, ошибка) GHC. Надеюсь, что однажды GHC, по крайней мере, выпустит предупреждение в таких случаях. – chi
Чтобы избежать проблемы, упомянутой @chi, если она на самом деле ваша проблема, постройте с помощью '-fno-omit-yields' –
@chi: Не могли бы вы сказать, что это ответ? Может быть, в сочетании с предложением Рейда Бартона? –