【问题标题】:Using ReaderT based Client wrapper with Servant client将基于 ReaderT 的客户端包装器与 Servant 客户端一起使用
【发布时间】:2017-01-10 22:52:03
【问题描述】:

我正在尝试使用额外的 Token 参数来扩展仆人的 ClientM monad,我将使用该参数来调用 REST 资源。

type TClient a = ReaderT Token ClientM a

然后我为仆人模式匹配定义了以下内容

get :: Token -> ClientM Text
post :: Token -> Int -> ClientM Text
get :<|> post = client (Proxy :: Proxy MyAPI)

现在我的扩展客户端来玩了。我就是这样使用它的:

getT :: TClient Text
getT = undefined -- implementation to extract token and call 'get'

postT :: Int -> TClient Text
portT = undefined -- implementation to extract token and call 'post'

queries :: TClient Text
queries = do
    text1 <- postT 5
    text2 <- getT
    return (text1 ++ text2)

--| runReaderT and then runClientM
runTClient :: Token -> TClient a -> ClientEnv -> IO (Either ServantError a)
runTClient token tcm env = runClientM (runReaderT tcm token) env

问题是如何更好地实现getTpostT 函数。

我将发布我当前的解决方案,但希望这里更有经验的haskeller 可以提出更好的解决方案

【问题讨论】:

    标签: haskell monad-transformers servant


    【解决方案1】:

    下面的例子是页面底部的 IO Control Monad Reader 我必须实现函数来提升 ReaderT

    liftReaderT :: m a -> ReaderT r m a
    liftReaderT m = ReaderT (const m)
    

    那么我可以有这样的详细实现:

    getT :: TClient Text
    getT = do
        t <- ask
        liftReaderT $ get t
    

    【讨论】:

      【解决方案2】:

      ReaderT rMonadTrans 的一个实例,所以你可以使用lift :: (MonadTrans t, Monad m) =&gt; m a -&gt; t m a。专门针对有问题的类型,即lift :: ClientM a -&gt; ReaderT Token ClientM a

      getT :: Int -> TClient Text
      getT = lift . get
      
      postT :: Int -> TClient Text
      postT = lift . post
      

      【讨论】:

      • 感谢您的回答!只做lift get 我得到了Couldn't match expected type 'ClientM Text' with actual type 'Token -&gt; ClientM Text' 所以我不得不做ask &gt;&gt;= \t -&gt; lift $ get t...
      • @klappvisor 我的错误,应该是lift . get。我会修复答案
      • 对于get :: Token -&gt; ClientM Text,我必须在getT 中读取Token 并将其传递给get。目前lift . get我有Couldn't match type 'Token -&gt; t0 ClientM Text' with 'ReaderT Token ClientM Text'
      猜你喜欢
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      • 2019-07-25
      • 2020-01-23
      • 2015-06-22
      • 2012-10-16
      • 2013-06-18
      • 1970-01-01
      相关资源
      最近更新 更多