Haskell 如何在async内部强制执行完全求值?
我正在使用异步库,并试图在实践中找出它的API。我注意到了一种出乎意料的奇怪行为。它看起来像一个bug,但可能是一个特性,我只需要知道一个解决方法Haskell 如何在async内部强制执行完全求值?,haskell,asynchronous,lazy-evaluation,ghc,Haskell,Asynchronous,Lazy Evaluation,Ghc,我正在使用异步库,并试图在实践中找出它的API。我注意到了一种出乎意料的奇怪行为。它看起来像一个bug,但可能是一个特性,我只需要知道一个解决方法 import Control.Concurrent import Control.Concurrent.Async > withAsync (putStrLn "HELLO") (\_ -> putStrLn "WORLD") WORLHEDL 上面的代码段工作得很好-两行都已执行,但更复杂的
import Control.Concurrent
import Control.Concurrent.Async
> withAsync (putStrLn "HELLO") (\_ -> putStrLn "WORLD")
WORLHEDL
上面的代码段工作得很好-两行都已执行,但更复杂的异步体会部分计算
> withAsync (putStrLn "XXXXXXXXXX" >> putStrLn "HELLO") (\_ -> putStrLn "WORLD")
WOXRXLXDX
请参阅,未执行第二个putStrLn。
我想我需要用某种bnf来包装整个异步体,但它看起来很奇怪。为什么withAsync不为我这样做
forkIO工作得很好,但我不想为取消升空而烦恼。 async具有自动传播monad的对库unlift async
forkIO (Prelude.putStrLn "XXXXXXXXXX" >> Prelude.putStrLn "HELLO")
ThreadXIXdX X1X1X3X
XXX
HELLO
我找到了带叉功能的提升底座。它充当forkIO并将父monad传递给子线程。
withAsync
在主线程(第二个参数)终止时中断分叉线程(第一个参数)。这在以下文件中有明确说明:
当函数返回或抛出异常时,异步
上调用不间断取消
(…)这是async
的一个有用的变体,可确保async
不会意外运行
如果只想分叉线程,请使用async
async(putStrLn“xxxxxxx”>>putStrLn“WORLD”)>>putStrLn“HELLO”