首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用HTTP-导管时Haskell类型错误

使用HTTP-导管时Haskell类型错误
EN

Stack Overflow用户
提问于 2017-11-29 20:16:26
回答 1查看 96关注 0票数 0

我正在为Yesod应用程序进行OAuth2身份验证,而且我有一个类型错误,我真的不明白。目前,代码已被破坏,我还抛出了一些:: IO ()undefined的代码,以帮助我隔离类型错误,但相关代码如下:

代码语言:javascript
复制
getAccessToken :: Manager -> OAuth2 -> ExchangeToken -> IO (OAuth2Result Errors OAuth2Token)
getAccessToken manager oa code = do

  let (uri, defaultBody) = accessTokenUrl oa code
  let body = defaultBody <> [ ("client_id", TE.encodeUtf8 . oauthClientId $ oa )
                            , ("client_secret", TE.encodeUtf8 . oauthClientSecret $ oa)
                            , ("resource", TE.encodeUtf8 . oauthClientId $ oa)
                            ]

  response <- performOAuth2PostRequest manager oa uri body

  return undefined

performOAuth2PostRequest :: Manager -> OAuth2 -> URI -> PostBody -> IO (Response ByteString)
performOAuth2PostRequest manager oa uri body  = do
  defaultReq <- uriToRequest uri

  let addBasicAuth = applyBasicAuth (TE.encodeUtf8 . oauthClientId $ oa)
                                    (TE.encodeUtf8 . oauthClientSecret $ oa)

  let req = (addBasicAuth . updateRequestHeaders Nothing) defaultReq

  (httpLbs (urlEncodedBody body req) manager) :: IO (Response ByteString)

注意,我特别使用httpLbs (urlEnc...) manager扩展将IO (Response ByteString)的类型设置为IO (Response ByteString)。另外,这一行代码应该是IO操作,因为它是在IO操作的顶层执行的。

实际上,我运行了一个GHCi会话并执行了以下操作:

代码语言:javascript
复制
Network.OAuth.OAuth2.HttpClient Network.OAuth.OAuth2.Internal 
Network.HTTP.Conduit Data.Functor Prelude> :t httpLbs
httpLbs
  :: Control.Monad.IO.Class.MonadIO m =>
     Request
     -> Manager -> m (Response Data.ByteString.Lazy.Internal.ByteString)

这证实了我的理解,即httpLbs应该产生一个MonadIO m => m (Response ByteString)

但我得到的错误是:

代码语言:javascript
复制
• Couldn't match type ‘Response
                         Data.ByteString.Lazy.Internal.ByteString’
                 with ‘IO (Response ByteString)’
  Expected type: Manager -> IO (Response ByteString)
    Actual type: Manager
                 -> Response Data.ByteString.Lazy.Internal.ByteString
• The function ‘httpLbs’ is applied to two arguments,
  its type is ‘Request
               -> m1 (Response Data.ByteString.Lazy.Internal.ByteString)’,
  it is specialized to ‘Request
                        -> Manager -> Response Data.ByteString.Lazy.Internal.ByteString’

为什么GHC专攻m to Response 而不是 IO**??我该怎么修理它?**

EN

回答 1

Stack Overflow用户

发布于 2017-11-30 09:42:31

您还没有包含导入语句,因此很难调试它。不过,我的最佳猜测是您已经导入了Network.HTTP.Simple,它提供了不需要显式Manager参数的函数。我猜这是从提供预期类型的错误消息中猜出来的:

代码语言:javascript
复制
Request -> m1 (Response Data.ByteString.Lazy.Internal.ByteString)

解决方案:要么更改导入,要么删除Manager参数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47561071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档