특히이 클라이언트를 example에 적용하고 있습니다. 코드와 오류가 발생한 후 문제가 있다고 생각하는 전화를 드리겠습니다.ResourceT의 문제 해결
> {-# 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() }
가 여기에 문제의 오류가 Control.Monad.Trans.Class.MonadTrans ResourceT
에 대한 인스턴스가 없다고 말합니다 그러나 나는 인해 documentation에 있다고 생각합니다. 어디서 잘못 됐나요? 언급 한 바와 같이
아래 여기 ResourceT
자기 반성의 결과이다 Control.Monad.Trans.Resource
으로 계속 뭔가 janke있다. resourcet
의
*Main Control.Monad.Trans.Resource> :i ResourceT
newtype ResourceT m a
= Control.Monad.Trans.Resource.ResourceT (GHC.IORef.IORef
Control.Monad.Trans.Resource.ReleaseMap
-> m a)
-- Defined in `Control.Monad.Trans.Resource'
instance Monad m => Monad (ResourceT m)
-- Defined in `Control.Monad.Trans.Resource'
instance Functor m => Functor (ResourceT m)
-- Defined in `Control.Monad.Trans.Resource'
instance MonadBaseControl b m => MonadBaseControl b (ResourceT m)
-- Defined in `Control.Monad.Trans.Resource'
instance MonadThrow m => MonadThrow (ResourceT m)
-- Defined in `Control.Monad.Trans.Resource'
버전은
[[email protected] 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의 인스턴스는 어디에 있습니까?
다음 코드를 사용하면 동일한 결과가 나타납니다. 이것은 매우 이상합니다 :'foo :: ResourceT IO(); foo = 리프트 $ return()'. 결함이있는 패키지 데이터베이스와 관련이 없습니다. – dflemstr
나는 이것이 GHC 나 다른 시스템에서 버그가되어야한다고 결론을 내렸다. 이것에 대해 더 많은 지식을 가진 누군가가 나를 교정 할 수 있습니다. – dflemstr
패키지 작성자에게 전화를 걸도록 요청합니다. –