Я очень озадачен тем, как Слуга способен достичь волшебства, которое он делает, используя типизацию. Пример на веб-сайте уже сильно меня озадачивает:
type MyAPI = "date" :> Get '[JSON] Date
:<|> "time" :> Capture "tz" Timezone :> Get '[JSON] Time
Я получаю "дату", "время", [JSON]
и "tz" - литералы уровня. Это значения, которые имеют "ставшие" типы. Хорошо.
Я получаю, что :>
и :<|>
являются операторами типа. Хорошо.
Я не понимаю, как эти вещи, после того как они стали типами, могут быть извлечены обратно в ценности. Какой механизм для этого?
Я также не понимаю, как первая часть этого типа может заставить структуру ожидать функцию подписи IO Date
или как вторая часть этого типа может заставить фреймворк ожидать функцию подписи Timezone -> IO Time
от меня. Как происходит это преобразование?
И как же тогда фреймворк может вызвать функцию, для которой он изначально не знал тип?
Я уверен, что здесь есть ряд расширений GHC и уникальных функций, которые я не знаю, чтобы объединить эту магию.
Может кто-нибудь объяснить, какие функции задействованы здесь и как они работают вместе?