Haskell评估时限
是否有人知道一个函数只允许一定的时间来执行一个函数。有这样的类型签名的东西Haskell评估时限,haskell,time,Haskell,Time,是否有人知道一个函数只允许一定的时间来执行一个函数。有这样的类型签名的东西 limited::Int->(a->b)->a->IO (Maybe b) 我想不出如何实现,也找不到它。我问这个问题的原因是我要列出所有可能的程序,我想过滤掉那些耗时太长的程序。使用async包,我们可以race线程 import Control.Applicative import Control.Concurrent import Control.Concurrent.Async lim
limited::Int->(a->b)->a->IO (Maybe b)
我想不出如何实现,也找不到它。我问这个问题的原因是我要列出所有可能的程序,我想过滤掉那些耗时太长的程序。使用
async
包,我们可以race
线程
import Control.Applicative
import Control.Concurrent
import Control.Concurrent.Async
limited :: Int -> (a -> b) -> a -> IO (Maybe a)
limited n f a = isLeft <$> race (return $! f a) (threadDelay n)
where isLeft (Left a) = Just a
isLeft _ = Nothing
导入控件。应用程序
导入控制。并发
导入控制.Concurrent.Async
有限::Int->(a->b)->a->IO(可能是a)
有限n f a=isLeft竞赛(返回$!f a)(线程延迟n)
其中isLeft(左a)=仅a
isLeft=无
race
在不同的线程中运行两个IO
计算,并返回其中一个“赢”,因此我们只需将线程与threadDelay
进行竞赛
注意,我们使用($!)
来seq
结果fa
。如果我们不这样做,那么左
线程总是获胜,并且当您查看它时,计算实际上发生在主线程中。有来自系统的消息。超时:
timeout :: Int -> IO a -> IO (Maybe a)
要按你写的方式写,只需使用
limited t f x = timeout t $ do
let y = f x
y `seq` return y
请记住,Haskell的懒惰意味着任何值都是其他语言可能称之为“零参数的记忆函数”,因此您并不真正需要
(a->b)->a->
我不知道它的存在。有限的tfx=timeout t(return$!fx)
更好的是:timeout t$evaluate(fx)
(evaluate
在Control.Exception
中定义)