简体   繁体   中英

Error attempting to decode with wreq

I'm trying really hard to understand how to use lenses and wreq and its turning out to really slow me down.

The error seems to be claiming there's some mismatched type here. I'm not sure exactly how to handle that though. I'm still fairly new to haskell and these lenses are pretty confusing. However, wreq seems to be cleaner, which is why I chose to use it. Can anyone help me understand what the error is, and how to fix it? I seem to run into alot of these type errors. I am aware that Maybe TestInfo won't be returned by my code at the moment. That's ok. That error know how to handle. This error however, I don't.

Here is my code:

Module TestInformation:

{-# 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:

module Auth where

import qualified Data.ByteString as B

type Key = B.ByteString

The error:

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.

This type checks for me:

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 is an IO action, so to get its return value you need to use the monadic binding operator <- .

Full program: http://lpaste.net/133443 http://lpaste.net/133498

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM