簡體   English   中英

使用HTTP管道時Haskell類型錯誤

[英]Haskell Type Error while using HTTP-Conduit

我正在為Yesod應用程序進行OAuth2身份驗證,但遇到了我真的不理解的類型錯誤。 目前,代碼已損壞,並且拋出了:: IO ()undefined ,以幫助我隔離類型錯誤,但是相關代碼為:

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)

請注意,我使用ScopedTypeVariables擴展名專門將httpLbs (urlEnc...) manager操作的類型設置為IO (Response ByteString) ScopedTypeVariables 另外,該行代碼應該是IO操作,因為它是在IO操作的頂層執行的。

實際上,我進行了GHCi會議並做了:

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)

但是這是我得到的錯誤:

• 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專門用於Response而不是IO 我如何解決它?

您尚未包含import語句,因此很難調試它。 不過,我最好的猜測是您已導入Network.HTTP.Simple ,它提供了不需要顯式Manager參數的函數。 我從提供預期類型的​​錯誤消息中猜測出這一點:

Request -> m1 (Response Data.ByteString.Lazy.Internal.ByteString)

解決方案:更改導入,或刪除Manager參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM