Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell中的异步IO_Haskell_Promise - Fatal编程技术网

Haskell中的异步IO

Haskell中的异步IO,haskell,promise,Haskell,Promise,因此,在C#中有一个WWW类,您可以使用它从web加载数据。要异步处理对象,我需要做三件事 创建承诺单子 将某些任务或功能纳入承诺 将承诺发送到协同程序(它等待加载完成并解析承诺) 这太棒了!代码看起来是同步的,但进程是异步的。然而,我的C#实现是基于状态的,因此即使我的承诺在其他地方得到了解决,我也能得到结果 在一些帮助下,我在Haskell中实现了一个,但是我不知道如何将这个“对象”发送到一个协同程序(真的不知道如何在Haskell中做类似的事情),我永远看不到实现的承诺。因为没有副作用,所

因此,在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与之通信。