如何在Haskell(使用果戈理)中执行Google自定义搜索?

时间:2017-02-17 17:29:17

标签: haskell google-custom-search

我尝试使用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’

1 个答案:

答案 0 :(得分:2)

错误是说类型检查器无法确定要使用哪个AllowScopes实例,因为您没有指定范围。鉴于我对自定义搜索API的具体细节知之甚少,我将不得不推测该怎么做。

假设自定义搜索没有OAuth2范围 - 这似乎是这种情况,假设 gogol-customsearch (如您所述)中没有预定义范围,以及讨论在this question中 - 您可以使用Network.Google.Auth.Scopes中的forbid来“注释没有范围授权的凭据”。

searchCoversCustomly phrase = do
    env <- G.newEnv <&> G.forbid
    -- etc.