1

RESTリソースを呼び出すために使用するClientM追加のパラメーターを使用して、サーバントのモナドを拡張しようとしています。Token

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

問題は、より良い方法で実装getTおよびpostT機能する方法です。

現在の解決策を投稿しますが、ここでより経験豊富な haskeller がより良い解決策を提案できることを願っています

4

2 に答える 2

1

ReaderT rは のインスタンスなMonadTransので、そのまま使用できますlift :: (MonadTrans t, Monad m) => m a -> t m a。問題のタイプに特化した、それはlift :: ClientM a -> ReaderT Token ClientM a.

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

postT :: Int -> TClient Text
postT = lift . post
于 2017-01-11T00:49:22.880 に答える
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
于 2017-01-10T22:57:34.877 に答える