我真的很难理解如何使用镜头和wreq,结果真的让我慢下来了。
这个错误似乎是说这里有一些不匹配的类型。但我不知道该怎么处理。我对哈斯克尔还是个新手,这些镜头让我很困惑。然而,wreq看起来更干净,这就是我选择使用它的原因。有谁能帮助我了解错误是什么,以及如何解决它吗?我好像遇到了很多这种类型的错误。我知道我的代码目前不会返回Maybe TestInfo。没关系。那个错误知道如何处理。但是这个错误,我没有。
这是我的代码:
模块测试信息:

{-# LANGUAGE OverloadedStrings #-}

module TestInformation where

import Auth
import Network.Wreq
import Control.Lens
import Data.Aeson
import Data.Aeson.Lens (_String)


type TestNumber = String

data TestInfo = TestInfo {
                TestId       :: Int,
                TestName     :: String,
               }

instance FromJSON TestInfo


getTestInfo :: Key -> TestNumber -> Maybe TestInfo
getTestInfo key test =
  decode (res ^. responseBody . _String)
  where opts = defaults & auth ?~ oauth2Bearer key
        res  = getWith opts ("http://testsite.com/v1/tests/" ++ test)

模块验证:
module Auth where

import qualified Data.ByteString as B

type Key = B.ByteString

错误:
GHCi, version 7.10.1: http://www.haskell.org/ghc/  :? for help
[1 of 2] Compiling Auth   ( Auth.hs, interpreted )
[2 of 2] Compiling TestInformation ( TestInformation.hs, interpreted )

TestInformation.hs:36:18:
  Couldn't match type ‘Response body10’
               with ‘IO (Response Data.ByteString.Lazy.Internal.ByteString)’
Expected type: (body10
                -> Const Data.ByteString.Lazy.Internal.ByteString body10)
               -> IO (Response Data.ByteString.Lazy.Internal.ByteString)
               -> Const
                    Data.ByteString.Lazy.Internal.ByteString
                    (IO (Response Data.ByteString.Lazy.Internal.ByteString))
  Actual type: (body10
                -> Const Data.ByteString.Lazy.Internal.ByteString body10)
               -> Response body10
               -> Const Data.ByteString.Lazy.Internal.ByteString (Response body10)
In the first argument of ‘(.)’, namely ‘responseBody’
In the second argument of ‘(^.)’, namely ‘responseBody . _String’

TestInformation.hs:36:33:
Couldn't match type ‘Data.ByteString.Lazy.Internal.ByteString’
               with ‘Data.Text.Internal.Text’
Expected type: (Data.ByteString.Lazy.Internal.ByteString
                -> Const
                     Data.ByteString.Lazy.Internal.ByteString
                     Data.ByteString.Lazy.Internal.ByteString)
               -> body10 -> Const Data.ByteString.Lazy.Internal.ByteString body10
  Actual type: (Data.Text.Internal.Text
                -> Const
                     Data.ByteString.Lazy.Internal.ByteString Data.Text.Internal.Text)
               -> body10 -> Const Data.ByteString.Lazy.Internal.ByteString body10
In the second argument of ‘(.)’, namely ‘_String’
In the second argument of ‘(^.)’, namely ‘responseBody . _String’
Failed, modules loaded: Auth.
Leaving GHCi.

最佳答案

这种类型的检查我:

getTestInfo :: Key -> TestNumber -> IO (Maybe TestInfo)
getTestInfo key test = do
  res <- getWith opts ("http://testsite.com/v1/tests/" ++ test)
  return $ decode (res ^. responseBody)
  where opts = defaults & auth ?~ oauth2Bearer key

getWith是一个io操作,因此要获得它的返回值,需要使用一元绑定运算符<-
完整程序:http://lpaste.net/133443http://lpaste.net/133498

关于http - 尝试用wreq解码时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30486428/

10-12 14:11