2016-06-12 4 views
1

Я пытаюсь создать привязки клиентов к веб-API с помощью библиотеки servant. Я хочу, чтобы иметь возможность отправлять любые объекты JSON.Клиент-клиент с переменной типа с аргументом FromJSON

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_’: 
     ... 

Как я могу параметрирования мой MyAPI, client и Proxy принять переменную типа?

ответ

1

Вам нужно связать тип 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)) 

 Смежные вопросы

  • Нет связанных вопросов^_^