Haskell 如何在async内部强制执行完全求值?

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 上面的代码段工作得很好-两行都已执行,但更复杂的

我正在使用异步库,并试图在实践中找出它的API。我注意到了一种出乎意料的奇怪行为。它看起来像一个bug,但可能是一个特性,我只需要知道一个解决方法

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”