Haskell 用资源解决问题

Haskell 用资源解决问题,haskell,monads,monad-transformers,conduit,Haskell,Monads,Monad Transformers,Conduit,我正在调整这个,特别是客户。我会告诉你我认为问题是什么,遵循代码和它产生的错误 > {-# LANGUAGE OverloadedStrings #-} > import Network.HTTP.Conduit > ( http, parseUrl, newManager,def, withManager, RequestBody (RequestBodyLBS) > , requestBody, method, Response (..) > ) > im

我正在调整这个,特别是客户。我会告诉你我认为问题是什么,遵循代码和它产生的错误

> {-# LANGUAGE OverloadedStrings #-}
> import Network.HTTP.Conduit
> ( http, parseUrl, newManager,def, withManager, RequestBody (RequestBodyLBS)
> , requestBody, method, Response (..)
> )
> import Data.Aeson (Value (Object, String))
> import Data.Aeson.Parser (json)
> import Data.Conduit
> import Data.Conduit.Attoparsec (sinkParser)
> import Control.Monad.IO.Class (liftIO)
> import Control.Monad.Trans.Class (lift)
> import Data.Aeson (encode, (.=), object)


> main :: IO ()
> main = withManager $ \manager -> do
>    value <- makeValue
> -- We need to know the size of the request body, so we convert to a
> -- ByteString
>    let valueBS = encode value
>    req' <- parseUrl "http://10.64.16.6:3000/"
>    let req = req' { method = "POST", requestBody = RequestBodyLBS valueBS }
>    Response status version headers body <- http req manager
>    resValue <- body $$ sinkParser json
>    handleResponse resValue

> -- Application-specific function to make the request value
> makeValue :: ResourceT IO Value
> makeValue = return $ object
>    [ ("foo" .= ("bar" :: String))
>    ]

> -- Application-specific function to handle the response from the server
> handleResponse :: Value -> ResourceT IO ()
> handleResponse foo = do  
>    _ <- lift (print foo)
>    return ()

No instance for (Control.Monad.Trans.Class.MonadTrans ResourceT)
  arising from a use of `lift'
Possible fix:
  add an instance declaration for
  (Control.Monad.Trans.Class.MonadTrans ResourceT)
In a stmt of a 'do' block: _ <- lift (print foo)
In the expression:
  do { _ <- lift (print foo);
       return () }
In an equation for `handleResponse':
    handleResponse foo
      = do { _ <- lift (print foo);
             return () }
resourcet
的版本为

[mlitchard@Boris Boris]$ ghc-pkg list resourcet
WARNING: there are broken packages.  Run 'ghc-pkg check' for more details.
/usr/lib/ghc-7.4.1/package.conf.d
/home/mlitchard/.ghc/x86_64-linux-7.4.1/package.conf.d
   resourcet-0.3.2.1
关于如何进行有什么想法吗?
MonadTrans ResourceT的实例在哪里?

编辑:这个答案不能解决问题,导入仍然不能解决实例,即使它应该解决。这似乎是GHC或其他系统中的一个bug

该模块仅为方便而重新导出;资源monad转换器在单独的包中定义。因此,是否不重新导出类实例(显然是?)。您需要手动导入才能访问关联的类实例。当然,这可以通过以下语法完成:

import Control.Monad.Trans.Resource () -- Only import instances

编辑:此答案不能解决问题,导入仍然不能解决实例,即使它应该解决。这似乎是GHC或其他系统中的一个bug

该模块仅为方便而重新导出;资源monad转换器在单独的包中定义。因此,是否不重新导出类实例(显然是?)。您需要手动导入才能访问关联的类实例。当然,这可以通过以下语法完成:

import Control.Monad.Trans.Resource () -- Only import instances

如果我是个赌徒,我会说你安装了多个版本的库。例如,假设您有0.2和0.3版的transformers,resourcet是根据0.2版构建的。编写代码
import Control.Monad.Trans.Class(lift)
时,您导入的是
lift
的0.3版,但没有涉及该版本的实例


测试这一点的最简单方法是对代码进行分类。Cabal将确保您拥有所涉及的库的正确版本。

如果我是一个赌徒,我会说您安装了多个版本的库。例如,假设您有0.2和0.3版的transformers,resourcet是根据0.2版构建的。编写代码
import Control.Monad.Trans.Class(lift)
时,您导入的是
lift
的0.3版,但没有涉及该版本的实例


测试这一点的最简单方法是对代码进行分类。Cabal将确保您拥有相关库的正确版本。

我将此标记为正确,因为它有意义。但我的代码给出了完全相同的错误,就好像我从未添加过新的导入行一样。我甚至删除了试图生成警告的
()
。无警告您是否已尝试将文件加载到
ghci
中,并使用
:i
在作用域中显示有关
ResourceT
的信息?我将此标记为正确,因为它有意义。但我的代码给出了完全相同的错误,就好像我从未添加过新的导入行一样。我甚至删除了试图生成警告的
()
。无警告您是否尝试过将文件加载到
ghci
并使用
:i
在范围内显示有关
ResourceT
的信息?使用以下代码,我现在得到了相同的结果!这很奇怪:
foo::resourcetio();foo=lift$return()
。它与错误的包数据库无关。我的结论是,这一定是GHC或其他系统中的错误。对此有更多了解的人可能会插话纠正我。我正在请包作者插话。我无法重现此问题:您的代码在这里编译得很好。您可能需要提供所有相关库和程序的特定版本:
resourcet
conductor
http conductor
、和
ghc
。通过下面的代码,我现在得到了相同的结果!这很奇怪:
foo::resourcetio();foo=lift$return()
。它与错误的包数据库无关。我的结论是,这一定是GHC或其他系统中的错误。对此有更多了解的人可能会插话纠正我。我正在请包作者插话。我无法重现此问题:您的代码在这里编译得很好。您可能必须提供所有相关库和程序的特定版本:
resourcet
conductor
http conductor
、和
ghc
。配置BorisTest-0.1.0.0。。。建筑BorisTest-0.1.0.0。。。BorisTest-0.1.0.0的预处理可执行文件“Boris_测试”。。。client.hs:12:8:找不到模块
Control.Monad.Trans.Class'它是隐藏包的成员
transformers-0.3.0.0'。也许您需要将
transformers'添加到.cabal文件中的构建中。它是隐藏包的成员
transformers-0.2.2.0'。也许您需要在.cabal文件的构建中添加“transformers”。使用-v查看搜索的文件列表。故事的寓意是,没有理由每次都不使用cabal来处理任何严重的事情。配置BorisTest-0.1.0.0。。。建筑BorisTest-0.1.0.0。。。BorisTest-0.1.0.0的预处理可执行文件“Boris_测试”。。。client.hs:12:8:找不到模块
Control.Monad.Trans.Class'它是隐藏包的成员
transformers-0.3.0.0'。也许您需要在.cabal文件中添加
transformers'到构建中。它是隐藏包的成员
transformers-0.2.2.0'。也许您需要在.cabal文件的构建中添加“transformers”。使用-v查看搜索的文件列表。故事的寓意是,并没有理由每次都不使用阴谋集团做任何严肃的事情。