我刚刚阅读了有关使用
这感觉很像一个Monad(-transformer?)。它感觉应该与CPS Monad有些关系,但也许不是。
这是我尝试编写相应的Haskell类型。
这是否是Haskell中对应的类型?是否有任何Haskell库可以实现处理异步函数/操作的方式(或类似方式)?
另外:你能使用CPS-transformer构建这个吗?
编辑
是的,
await
和async
关键字处理C# 5.0中的异步函数的新方法。来自C#参考文档的示例:private async Task SumPageSizesAsync()
{
// To use the HttpClient type in desktop apps, you must include a using directive and add a
// reference for the System.Net.Http namespace.
HttpClient client = new HttpClient();
// . . .
Task<byte[]> getContentsTask = client.GetByteArrayAsync(url);
byte[] urlContents = await getContentsTask;
// Equivalently, now that you see how it works, you can write the same thing in a single line.
//byte[] urlContents = await client.GetByteArrayAsync(url);
// . . .
}
Task<byte[]>
代表异步任务的未来,该任务将生成类型为byte[]
的值。在Task
上使用关键字await
基本上会将函数的其余部分放在一个续体中,在任务完成时调用该续体。任何使用await
的函数必须使用关键字async
并具有类型Task<a>
,如果它返回类型a
。
所以这些行
byte[] urlContents = await getContentsTask;
// Do something with urlContents
会翻译成类似的东西
Task newTask = getContentsTask.registerContinuation(
byte[] urlContents => {
// Do something with urlContents
});
return newTask;
这感觉很像一个Monad(-transformer?)。它感觉应该与CPS Monad有些关系,但也许不是。
这是我尝试编写相应的Haskell类型。
-- The monad that async functions should run in
instance Monad Async
-- The same as the the C# keyword
await :: Async (Task a) -> Async a
-- Returns the current Task, should wrap what corresponds to
-- a async method in C#.
asyncFunction :: Async a -> Async (Task a)
-- Corresponds to the method Task.Run()
taskRun :: a -> Task a
并且上面例子的粗略翻译
instance MonadIO Async -- Needed for this example
sumPageSizesAsync :: Async (Task ())
sumPageSizesAsync = asyncFunction $ do
client <- liftIO newHttpClient
-- client :: HttpClient
-- ...
getContentsTask <- getByteArrayAsync client url
-- getContentsTask :: Task [byte]
urlContents <- await getContentsTask
-- urlContents :: [byte]
-- ...
这是否是Haskell中对应的类型?是否有任何Haskell库可以实现处理异步函数/操作的方式(或类似方式)?
另外:你能使用CPS-transformer构建这个吗?
编辑
是的,
Control.Concurrent.Async
模块解决了类似的问题(并具有类似的接口),但它采用完全不同的方式。我想Control.Monad.Task
更匹配。我正在寻找一种使用Continuation Passing Style幕后进行Futures的单调接口。
async
,它应该提供您需要的功能:http://hackage.haskell.org/package/async - MoFu