Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading Haskell函数超时_Multithreading_Haskell_Io_Timeout - Fatal编程技术网

Multithreading Haskell函数超时

Multithreading Haskell函数超时,multithreading,haskell,io,timeout,Multithreading,Haskell,Io,Timeout,试图理解如何为factorse编写一个包装函数,该函数在u usec之后超时。如果成功,则返回RetType,否则返回Integer(传入的内容) 我是哈斯克尔的新手。我知道超时需要在IOMonad中工作,但我很难收回适当的结果。(注意:我也没有与结婚也许RetType也可以) 感谢您对类型的任何帮助,timeout::Int->IO a->IO(可能是a),它可以用作 import Math.NumberTheory.Primes (factorise) import System.Timeo

试图理解如何为factorse编写一个包装函数,该函数在u usec之后超时。如果成功,则返回
RetType
,否则返回
Integer
(传入的内容)

我是哈斯克尔的新手。我知道超时需要在
IO
Monad中工作,但我很难收回适当的结果。(注意:我也没有与
结婚
也许RetType
也可以)


感谢您对类型的任何帮助,
timeout::Int->IO a->IO(可能是a)
,它可以用作

import Math.NumberTheory.Primes (factorise)
import System.Timeout (timeout)
import Control.Monad (liftM)

type RetType = [(Integer, Int)] -- factorise's return type

-- proposed function
timedFact :: Integer -> Integer -> Either RetType Integer
timedFact u n = ?
测试:

import Math.NumberTheory.Primes (factorise)
import System.Timeout (timeout)
import Control.Exception (evaluate)
import Control.DeepSeq (force)

timedFact :: Int -> Integer -> IO (Maybe [(Integer, Int)])
timedFact u = 
      timeout u . evaluate . force . factorise 
更新:作为用户2407038(谢谢!)


同样有效
($!!)
来自
控件。DeepSeq也来自
控件。引用文档,.

我认为您必须强制计算
x
,否则计算发生在
timeout
@user2407038 cf.@user2407038之外,而
evaluate x
看起来很像
return$!x
,结果是有重要但微妙的区别。微妙到足以迷惑一些GHC的主要实施者;重要到足以导致一个特殊的
seq
primop,只是为了正确定义
evaluate
。@WillNess@dfeuer
return$!!factorse v
有效
\u v->timeout u$return$let r=在r`deepseq`r
中分解v不起作用,相当于
强制(返回r)
。但是,
\u v->timeout u$let r=r`deepseq`return r中的factorse v
确实有效,相当于
return$!!r
evaluate
确实是不必要的,但是由于在调用evaluate时已经计算了该值,我怀疑它是否有任何开销,所以这可能无关紧要。@user3424410 1)您知道可以删除注释吗?2) 我强烈建议不要
unsafePerformIO
。它的名称中有
不安全
,这是有原因的。无论何时你使用它,你都应该证明它不会引起麻烦。如果你不能做到这一点,你应该避免使用它,因为你可以很容易地把事情搞砸。只需像任何其他
IO
操作一样使用
timedFact
。您可能还对以下操作感兴趣:cf。
 #> timedFact 3000000 1231231231223234234273434343469494949494499437141
Nothing
(3.04 secs, 2639142736 bytes)

 #> timedFact 4000000 1231231231223234234273434343469494949494499437141
Just [(1009,1),(47729236307,1),(125199345589541,1),(204202903382078984027,1)]
(3.07 secs, 2662489296 bytes)
timedFact u n = timeout u (return $!! factorise n)