我尝试使用Gogol进行Google自定义搜索。我有以下代码,但它没有编译,我不理解告诉我原因的错误消息。如何让程序编译以便谷歌搜索工作?
searchCoversCustomly :: Text -> IO Search
searchCoversCustomly phrase = do
env <- G.newEnv -- create google environment
rVols <- G.runResourceT . G.runGoogle env $ do -- run request
let request = (cSEList phrase) -- request construction
& (cselCx .~ Just cx)
. (cselNum .~ 3)
. (cselSearchType .~ Just Image)
G.send request
return rVols
where cx = "..."
这会导致以下错误消息:
src/GoogleInteraction.hs:56:12: error:
• Ambiguous type variable ‘s0’ arising from a use of ‘G.newEnv’
prevents the constraint ‘(G.AllowScopes s0)’ from being solved.
Probable fix: use a type annotation to specify what ‘s0’ should be.
These potential instances exist:
instance G.AllowScopes '[]
-- Defined in ‘Network.Google.Auth.Scope’
...plus one instance involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In a stmt of a 'do' block: env <- G.newEnv
In the expression:
do { env <- G.newEnv;
rVols <- G.runResourceT . G.runGoogle env
$ do { let ...;
G.send request };
return rVols }
我还为Google图书提供了一系列代码,并与Gogol合作。不同之处在于我在那里提供了一个相关的范围,就像果戈理文档instruct一样。
对于gogol-books' docs中记录的BooksScope图书,但gogol-customsearch的文档中没有提及此范围。
如何让程序编译以便谷歌搜索有效?谢谢!
===编辑:包括更改为G.newEnv <$> forbid
===
• Couldn't match expected type ‘IO a0’
with actual type ‘k10 '[] -> k10 '[]’
• Probable cause: ‘G.forbid’ is applied to too few arguments
In the second argument of ‘(<$>)’, namely ‘G.forbid’
答案 0 :(得分:2)
错误是说类型检查器无法确定要使用哪个AllowScopes
实例,因为您没有指定范围。鉴于我对自定义搜索API的具体细节知之甚少,我将不得不推测该怎么做。
假设自定义搜索没有OAuth2范围 - 这似乎是这种情况,假设 gogol-customsearch (如您所述)中没有预定义范围,以及讨论在this question中 - 您可以使用Network.Google.Auth.Scopes
中的forbid
来“注释没有范围授权的凭据”。
searchCoversCustomly phrase = do
env <- G.newEnv <&> G.forbid
-- etc.