首页 > 解决方案 > 使用非 IO 函数 haskell 超时

问题描述

我的函数fun1不是 IO 并且计算量很大,所以我想运行它最多指定的秒数。我找到了一个函数timeout,但它要求这个fun1IO

timeout :: Int -> IO a -> IO (Maybe a)

我该如何规避这个问题,或者有更好的方法来实现我的目标?

编辑:我修改了第一句fun1是 NOT IO,它是 type fun1 :: Formula -> Bool

标签: haskell

解决方案


接近talex所说的除了移动seq应该工作。这是一个使用低效率fib作为昂贵计算的示例。

Prelude> import System.Timeout
Prelude System.Timeout> :{
Prelude System.Timeout| let fib 0 = 0
Prelude System.Timeout|     fib 1 = 1
Prelude System.Timeout|     fib n = fib (n-1) + fib (n-2)
Prelude System.Timeout| :}
Prelude System.Timeout> timeout 1000000 (let x = fib 44 in x `seq` return x)
Nothing
Prelude System.Timeout>

推荐阅读