具有 FromJSON 约束的类型变量的仆人客户端

Servant client with type variable with FromJSON contraint

我正在尝试使用 servant 库创建到 Web API 的客户端绑定。 我希望能够发送任何 JSON 个对象。

import           Control.Monad.Trans.Except (ExceptT, runExceptT)
import           Data.Proxy
import           Network.HTTP.Client (Manager)
import           Servant.API
import           Servant.Client
import           Data.Aeson

-- | This methods accepts any instance of 'ToJSON'
--   I would like to have only this method exported from the module
send :: ToJSON a => a -> Manager -> IO (Either ServantError Result)
send x manager = runExceptT $ send_ x manager baseUrl

type MyAPI a = "acceptAnyJson" 
    :> ReqBody '[JSON] a
    :> Post '[JSON] Result

api :: ToJSON a => Proxy (MyAPI a) 
api = Proxy 

send_ :: ToJSON a => a -> Manager -> BaseUrl -> ExceptT ServantError IO Result
send_ = client api

现在当我尝试编译它时出现错误消息:

Couldn't match type ‘a0’ with ‘a’
      because type variable ‘a’ would escape its scope
    This (rigid, skolem) type variable is bound by
      the inferred type for ‘send_’:
      ...

如何参数化我的 MyAPIclientProxy 以接受类型变量?

您需要将 api 的类型与您要发送的内容的类型联系起来:

{-# LANGUAGE ScopedTypeVariables #-}
send_ :: forall a. (FromJSON a) => a -> Manager -> BaseUrl -> ExceptT ServantError IO Result
send_ = client (api :: Proxy (MyAPI a))

或者为什么那时还要费心 api:

send_ = client (Proxy :: Proxy (MyAPI a))