当前位置:  开发笔记 > 编程语言 > 正文

当thunk被垃圾收集时,Haskell会丢弃火花吗?

如何解决《当thunk被垃圾收集时,Haskell会丢弃火花吗?》经验,为你挑选了1个好方法。

例如:

x :: Maybe a
y :: a
y `par` x `pseq` (fromMaybe y x)

y如果x被更快地计算(很多),停止和丢弃的火花是Just ...什么?

更具体地说,我想搜索一个列表,但每次比较都非常昂贵.我想要对搜索进行并行化,但是我希望在找到匹配项后将其余的比较放弃.



1> Yuras..:

您是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火花。

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有