根據關於hackage的Control.Concurrent.MVar
文檔,我們對使用MVar
s有一個「疑難」。這是link。使用Haskell的MVar包但嚴格執行seq
MVar說,當您使用putMVar
在MVar
中放置某些東西時,如果您要放入的東西是一個巨大的thunk,接收線程將有繁瑣的評估工作,而不是發送線程。
除了這可能是煩人的或無根據的,爲了彌補這種情況,它指向我們的方向evaluate
,其本身說使用seq
。每個人最喜歡的haskell函數。
Evaluate的語義據說意思是這樣的:
evaluate x `seq` y ==> y
所以我的問題是:爲什麼不會這樣評價在分叉線程!?!?!
concTreeMap :: (a -> b) -> BinaryTree a -> IO (BinaryTree b)
concTreeMap f Leaf = return Leaf
concTreeMap f (Branch v l r) = do
res <- newEmptyMVar
forkIO $ do
let fv = f v
evaluate fv `seq` (putMVar res fv)
v' <- takeMVar res
l' <- concTreeMap f l
r' <- concTreeMap f r
return (Branch v' l' r')
編輯追加同等加速...
不知怎的,這等同於以下(不使用評價,但使用了序列)的答案......反正我覺得加快點是a)提供提示,關於thunk的評價和2 Haskell的運行時)從移動的認沽
concTreeMap :: (a -> b) -> BinaryTree a -> IO (BinaryTree b)
concTreeMap f Leaf = return Leaf
concTreeMap f (Branch v l r) = do
res <- newEmptyMVar
forkIO $ do { let fv = f v in fv `seq` putMVar res fv }
l' <- concTreeMap f l
r' <- concTreeMap f r
v' <- takeMVar res
return (Branch v' l' r')
您引用的那個方程式正是說''evaluate'seq' y''與'y'相同,即您使用'evaluate'什麼都不做。 –