Обучающее руководство по клиенту на 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
автоматически установит все указанные зависимости.