我正在为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)注意,我特别使用httpLbs (urlEnc...) manager扩展将IO (Response ByteString)的类型设置为IO (Response ByteString)。另外,这一行代码应该是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 to Response 而不是 IO**??我该怎么修理它?**
发布于 2017-11-30 09:42:31
您还没有包含导入语句,因此很难调试它。不过,我的最佳猜测是您已经导入了Network.HTTP.Simple,它提供了不需要显式Manager参数的函数。我猜这是从提供预期类型的错误消息中猜出来的:
Request -> m1 (Response Data.ByteString.Lazy.Internal.ByteString)解决方案:要么更改导入,要么删除Manager参数。
https://stackoverflow.com/questions/47561071
复制相似问题