Haskell 仆人 - 有没有办法组合 API 类型?

Haskell Servant - is there a way to compose API types?

我知道这不是有效的语法,但是有没有办法在 servant 中完成这样的事情?

type StandardAPI = "foo" :> Get '[JSON] Whatever

type CustomAPI = StandardAPI :<|> "customroute" :> Get '[JSON] Blah

换句话说,组合 API。在 Spock 中,我可以使用 monadic 路由构造来做到这一点,但我不确定如何在 servant 中做到这一点。

这样我就可以跨 API 重用共享路由。使用它的另一个原因是某些类型不适用于客户端生成器,例如 Raw。

是的,引用 Servant documentation 你可以使用

type CombinedAPI = "users" :> UsersAPI
          :<|> "products" :> ProductsAPI

server :: Server CombinedAPI
server = usersServer :<|> productsServer

usersServer :: Server UsersAPI
usersServer = -- implementation

productsServer :: Server ProductsAPI
productsServer = -- implementation