У меня есть функция уровня типа (семейство типов) в приложении Haskell Servant, которое принимает символ и создает тип (маршрут), т.е.
type family AppRoute (x :: Symbol) where
AppRoute x = x :> Get '[HTML] RawHtml
Ожидается, что это будет использоваться в API:
type ServerAPI =
Get '[HTML] RawHtml
:<|> UserAPI
:<|> AdminAPI
:<|> AppRoute "about"
:<|> AppRoute "contact"
:<|> AppRoute "services"
:<|> AppRoute "blog"
:<|> AppRoute "products"
Соответствующая функция сервера
server :: Server ServerAPI
server =
html
:<|> userServer
:<|> adminServer
:<|> html
:<|> html
:<|> html
:<|> html
:<|> html
По сути, все AppRoutes отправляются в одну и ту же конечную точку (необработанный HTML-файл). Есть ли способ устранить дублирование (ссылаясь на последние пять маршрутов), написав что-то вроде (это не компилируется)
type family AppRoute where
AppRoute = String :> Get '[HTML] RawHtml
type ServerAPI =
Get '[HTML] RawHtml
:<|> UserAPI
:<|> AdminAPI
:<|> AppRoute _ -- * the problem is here. One function is needed here
с соответствующим сервером
server :: Server ServerAPI
server =
html
:<|> userServer
:<|> adminServer
:<|> html
Таким образом, AppRoutes - это функция уровня типа, которая принимает любую строку и возвращает маршрут.
В итоге вместо записи
:<|> AppRoute "about" :<|> AppRoute "contact" :<|> AppRoute "services" :<|> AppRoute "products"
Я хочу быть в состоянии написать только
: <|> AppRoute _