Haskell中的异步IO
因此,在C#中有一个WWW类,您可以使用它从web加载数据。要异步处理对象,我需要做三件事Haskell中的异步IO,haskell,promise,Haskell,Promise,因此,在C#中有一个WWW类,您可以使用它从web加载数据。要异步处理对象,我需要做三件事 创建承诺单子 将某些任务或功能纳入承诺 将承诺发送到协同程序(它等待加载完成并解析承诺) 这太棒了!代码看起来是同步的,但进程是异步的。然而,我的C#实现是基于状态的,因此即使我的承诺在其他地方得到了解决,我也能得到结果 在一些帮助下,我在Haskell中实现了一个,但是我不知道如何将这个“对象”发送到一个协同程序(真的不知道如何在Haskell中做类似的事情),我永远看不到实现的承诺。因为没有副作用,所
您如何在Haskell上处理此问题?下面是一个查询两台服务器、等待响应和
fmap
查询其中一个请求结果的示例。对于Async
type(),似乎有一个Functor
实例,但没有Monad
实例
module Main where
-- async
import Control.Concurrent.Async
-- HTTP
import Network.HTTP
mergeHTTPCode :: (Int, Int, Int) -> String
mergeHTTPCode (a,b,c) = show a ++ show b ++ show c
main :: IO ()
main = do
a1 <- async $ do
rsp <- Network.HTTP.simpleHTTP (getRequest "http://www.haskell.org/")
getResponseBody rsp
a2 <- async $ do
rsp <- Network.HTTP.simpleHTTP (getRequest "http://www.duckduckgo.com/")
getResponseCode rsp
page1 <- wait a1
page2 <- mergeHTTPCode <$> wait a2
print page1
print page2
modulemain其中
--异步的
导入控制.Concurrent.Async
--HTTP
导入网络.HTTP
mergeHTTPCode::(Int,Int,Int)->字符串
mergeHTTPCode(a,b,c)=显示a++显示b++显示c
main::IO()
main=do
你读了吗?第二部分在一些变体中实现了Async
。可能是您要研究的包。基本上,像同步流一样执行协同程序
的方法实际上是异步的,Haskell比听起来更简单,它只是do
符号为我们提供的。也不需要明确的承诺类型。通常,当人们想要Haskell中的承诺时,他们要么想要async
,要么想要延续monad。GHC的运行时已经在幕后进行了异步I/O。只需使用forkIO
生成一个绿色线程,然后通过chans与之通信。