Обучающее руководство по клиенту на Haskell

Я новичок в Haskell и Servant и пытаюсь запустить официальное руководство. Я пытался заставить этот учебник работать, чтобы взглянуть на него, и не смог заставить его работать весь день. Я не хочу публиковать такой вопрос здесь, но я, честно говоря, не знаю, почему код не работает как Я не сделал никаких изменений в этом. Мне интересно, кто-нибудь еще пытался реализовать этот учебник и имеет похожие проблемы.

Я видел сообщения о том, что некоторые учебники больше не работают с текущими версиями сервантов, но этот учебник, кажется, самый последний для Servant Client.

Это учебное пособие http://haskell-servant.readthedocs.io/en/stable/tutorial/Client.html

Вот код

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeOperators #-}

module Client where

import Data.Aeson
import Data.Proxy
import GHC.Generics
import Network.HTTP.Client (newManager, defaultManagerSettings)
import Servant.API
import Servant.Client

data Position = Position
  { x :: Int
  , y :: Int
  } deriving (Show, Generic)

instance FromJSON Position

newtype HelloMessage = HelloMessage { msg :: String }
  deriving (Show, Generic)

instance FromJSON HelloMessage

data ClientInfo = ClientInfo
  { clientName :: String
  , clientEmail :: String
  , clientAge :: Int
  , clientInterestedIn :: [String]
  } deriving Generic

instance ToJSON ClientInfo

data Email = Email
  { from :: String
  , to :: String
  , subject :: String
  , body :: String
  } deriving (Show, Generic)

instance FromJSON Email

type API = "position" :> Capture "x" Int :> Capture "y" Int :> Get '[JSON] Position
      :<|> "hello" :> QueryParam "name" String :> Get '[JSON] HelloMessage
      :<|> "marketing" :> ReqBody '[JSON] ClientInfo :> Post '[JSON] Email

position :: Int -> Int -> ClientM Position

hello :: Maybe String -> ClientM HelloMessage

marketing :: ClientInfo -> ClientM Email

api :: Proxy API
api = Proxy

position :<|> hello :<|> marketing = client api

queries :: ClientM (Position, HelloMessage, Email)
queries = do
  pos <- position 10 10 
  message <- hello (Just "servant") 
  em  <- marketing (ClientInfo "Alp" "alp@foo.com" 26 ["haskell", "mathematics"])
  return (pos, message, em)

run :: IO ()
run = do
  manager <- newManager defaultManagerSettings
  res <- runClientM queries (ClientEnv manager (BaseUrl Http "localhost" 8081 ""))
  case res of
    Left err -> putStrLn $ "Error: " ++ show err
    Right (pos, message, em) -> do
      print pos
      print message
      print em

Вот ошибки, которые я получаю

Couldn't match type ‘http-client-0.4.31.2:Network.HTTP.Client.Types.Manager
                           -> BaseUrl -> ClientM Position’
                     with ‘Control.Monad.Trans.Except.ExceptT ServantError IO Position’
      Expected type: Int -> Int -> ClientM Position
        Actual type: Int
                     -> Int
                     -> http-client-0.4.31.2:Network.HTTP.Client.Types.Manager
                     -> BaseUrl
                     -> ClientM Position
    • When checking that the inferred type
        position :: Int
                    -> Int
                    -> http-client-0.4.31.2:Network.HTTP.Client.Types.Manager
                    -> BaseUrl
                    -> ClientM Position
      is as general as its signature
        position :: Int -> Int -> ClientM Position


Variable not in scope:
      runClientM
        :: ClientM (Position, HelloMessage, Email)
           -> t0 -> IO (Either a0 (a1, a2, a3))


Data constructor not in scope:
      ClientEnv
        :: http-client-0.4.31.2:Network.HTTP.Client.Types.Manager
           -> BaseUrl -> t0

0 ответов

В первой ошибке "не входит в объем" упоминается ClientMтип которого, в соответствии с за слугой-клиента список изменений, был представлен 0,9 версии служащего-клиента. Указаниеservant-client >= 0.9в зависимостях файла.cabal гарантирует, что cabal-install не будет загружать старую версию (хотя обратите внимание, что по состоянию на март 2020 года сама версия 0.9 уже довольно устарела). При использовании cabal-install версии 3 дальнейшие действия по настройке не требуются, так какcabal build автоматически установит все указанные зависимости.

Другие вопросы по тегам