6

受基本身份验证保护的 API

type SubApi = API1 :<|> API2 :<|> API3
type API = BasicAuth "foo-realm" AuthData :> SubApi

支持类型的处理程序AuthData -> Handler a

我有一组处理程序:

handler1 :: Request1 -> AuthMonad Response
handler2 :: Request2 -> AuthMonad Response

它在 AuthMonad 中运行,这是一个 ReaderT,其上下文部分由 AuthData 构建。使用enterand AuthMonad :~> Handler,我可以获得Server API类型的支持处理程序AuthData -> AuthMonad,但我真正想做的是使用AuthData参数作为 runReaderT 的环境。

我对正在进行的类型巫术了解得不够多,enter无法理解如何做到这一点。有任何想法吗?

4

1 回答 1

0

才意识到我把这个挂了。

大多数情况下,只是过度思考这个问题——答案很明显。在上述情况下,我创建了一个可以创建自然变换的函数:

enterAuth :: AuthData -> AuthMonad :~> Handler

然后我在构建 ServerT 时使用它:

protectedServer :: AuthData -> ServerT ProtectedAPI Handler
protectedServer ad = enter (enterAuth ad) protectedServer'

在哪里

genAuthServerContext :: Context (AuthHandler Request AuthData ': '[])
于 2017-11-26T20:18:43.643 回答