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
中定义)