[英]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.