当前位置: 首页 > 编程语言 > C#

Haskell相当于C#5 async - await分享

时间:2023-04-10 12:59:30 C#

C#学习教程:Haskell等价于C#5async/await来自等待的C#参考考试:privateasyncTaskSumPageSizesAsync(){//要在桌面应用程序中使用HttpClient类型,您必须包含一个using指令并添加//对System.Net.Http命名空间的引用。HttpClientclient=newHttpClient();//。..任务getContentsTask=client.GetByteArrayAsync(url);byte[]urlContents=awaitgetContentsTask;//等价地,既然您了解了它是如何工作的,您就可以在一行中编写相同的内容。//byte[]urlContents=awaitclient.GetByteArrayAsync(url);//。..Task表示将生成byte[]类型值的异步任务的Future。在Task上使用关键字await基本上会将函数的其余部分放在一个延续中,它将在任务完成时调用。任何使用await的函数都必须使用关键字async并且如果它返回Task类型则具有Task类型。像这样的行byte[]urlContents=awaitgetContentsTask;//DosomethingwithurlContents将转化为类似于TasknewTask=getContentsTask.registerContinuation(byte[]urlContents=>{//DosomethingwithurlContents});返回新任务;这感觉很像Monad(变形金刚?)。感觉它应该与CPSmonad有关,但也许不是。这是我尝试编写相应的Haskell类型--ThemonadthatasyncfunctionsshouldrunininstanceMonadAsync--与C#关键字相同await::Async(Taska)->Asynca--返回当前任务,应该包装对应于C#中的异步方法的内容。asyncFunction::Asynca->Async(Taska)--对应方法Task.Run()taskRun::a->Taska和上述示例实例的粗略翻译MonadIOAsync--本示例需要sumPageSizesAsync::异步(Task())sumPageSizesAsync=asyncFunction$doclient<-liftIOnewHttpClient--client::HttpClient--...getContentsTask<-getByteArrayAsyncclientTaskurl--Task[byte]urlContents<-awaitgetContentsTask--urlContents::[byte]--...这是Haskell中对应的类型吗?是否有任何Haskell库(或类似库)实现来处理异步函数/操作?另外:你能用CPS变压器建造吗?编辑是的,Control.Concurrent.Async模块确实解决了类似的问题(并且具有类似的界面),但是是以完全不同的方式解决的。我想Control.Monad.Task会更匹配。我正在寻找的(我认为)是Futures的monadic接口,它在幕后使用了ContinuationPassingStyle。这是一个构建在异步库之上的Taskmonad:Task$dow>=f=newTask$doaFut请注意,我没有检查monad法则,因此它可能不正确。以下是您如何定义在后台运行的原始任务:importControl.Concurrent(threadDelay)test1::TaskInttest1=newTask$dothreadDelay1000000--Wait1secondputStrLn"Hello,"return1test2::TaskInttest2=newTask$dothreadDelay1000000putStrLn“世界!”return2然后,您可以将Task与do符号结合使用,这将创建一个准备运行的新延迟任务:test3::TaskInttest3=don1结果,如有必要,阻塞直到完成。为了证明它有效,我将做两个简单的测试。首先,我将forktest3而不要求它的未来,只是为了确保它正确地产生复合线程:main=doforktest3getLine--wait而不要求未来这工作正常:$./task你好,世界!$现在我们可以测试当我们请求结果时会发生什么:main=dofut...也可以:$./taskHello,world!3$monad-par库提供了spawn和get函数,可用于创建类似Future的计算。您可以将Parmonad用于并行运行的纯代码,将ParIO用于具有副作用的代码。特别是,我认为您的代码示例可以转换为:inparallel,并返回一个IVar,稍后可以通过get查询它来检索其答案。我认为这两个函数的行为与async和await非常匹配。有关更多信息,我建议您阅读关于Haskell中的并行和并发编程的Parmonad章节。以上就是C#学习教程:Haskell相当于C#5async/await分享的所有内容。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注---本文收集自网络,并不代表侵权,如涉及侵权,请点击右转联系管理员删除。如需转载请注明出处: