例如:
x :: Maybe a y :: a y `par` x `pseq` (fromMaybe y x)
y
如果x
被更快地计算(很多),停止和丢弃的火花是Just ...
什么?
更具体地说,我想搜索一个列表,但每次比较都非常昂贵.我想要对搜索进行并行化,但是我希望在找到匹配项后将其余的比较放弃.
您是fromMaybe
不是要说maybe
?
x `par` y `pseq` (fromMaybe y x)
同样,您正在创造评估的火花x
,而不是y
。所以fromMaybe y x
直到被评估才被y
评估。可能您的意思相反:
y `par` x `pseq` (fromMaybe y x)
如果以上所有条件都是正确的,则您的问题的答案为“否”,火花在启动时不会停止(尽管如果尚未启动,则火花将被丢弃。)您可以通过以下测试进行检查:
import Data.Maybe import Control.Concurrent import Control.Parallel import System.IO.Unsafe import System.Mem {-# NOINLINE x #-} x = unsafePerformIO $ do threadDelay 1000 return (Just 1) {-# NOINLINE y #-} y = unsafePerformIO $ do print "will eval y" threadDelay 3000000 print "did eval y" return (2 :: Int) main :: IO () main = do print $ y `par` x `pseq` fromMaybe y x print "done" performGC threadDelay 4000000
输出:
"will eval y" 1 "done" "did eval y"
您也可以检查运行时统计信息+RTS -s
。它包含许多GC火花。