2015-10-29 4 views
6

Глядя на Haskell Servant package, есть первоначальный пример определения WebService API как:Понимание Haskell Тип Уровень литералы

   -- GET /date 
type MyAPI = "date" :> Get '[JSON] Date 
      -- GET /time/:tz 
     :<|> "time" :> Capture "tz" Timezone :> Get '[JSON] Time 

У меня возникли проблемы с пониманием того, что это значит, и хотел бы объяснить следующее:

  1. :> и :<|> являются инфиксные конструкторами. Означает ли это объявление типа, что они определены здесь или они используются здесь? Или, может быть, :> определен здесь, но :<|> определен в другом месте? Или что-то другое? Не знаете, как читать этот тип.

  2. Что такое '[JSON]? Это какой-то литеральный список на уровне типа? Что делает цитата?

ответ

5

The (инфиксные) конструкторы используются здесь, и они должны быть определены в другом месте в data или newtype деклараций. Объявления type не производят никаких конструкторов.

'[JSON] действительно представляет собой список уровней типа, эквивалентный JSON ': '[]. Одинарная кавычка указывает, что конструктор данных поднимается до конструктора типов. Я не уверен, что имеет глубокое значение, но, по крайней мере, это позволяет избежать путаницы, которая в противном случае могла бы возникнуть из-за того, что конструкторы данных и конструкторы типов могут обмениваться именами.

+0

Спасибо. Документация GHC по литералам на уровне шрифта ничего не говорит о списках. Вы знаете, где это определено? – Ana

+2

@ Стандартные типы всех типов продвигаемых типов автоматически определяются, когда используется расширение 'DataKinds'. [Подробнее см. Здесь.] (Https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/promotion.html) –

2

Только для справки, здесь приведены фактические определения :<|> и :>.

-- that's really like a pair of an 'a' and a 'b'... 
-- that can be chained in a nice way, as opposed to nested pairs. 
data a :<|> b = a :<|> b 
data a :> b 

Последняя не имеет конструктор, потому что это не нужно, комбинируя обработчики запросов вместе, в то время как мы повторно использовать :<|> символ, когда мы склеить несколько обработчиков запросов вместе, при значении уровня, в отличие от сопоставления описаний для нескольких конечных точек на уровне типа, где мы также используем оператор :<|>. В последнем случае мы ссылаемся на :<|> -the-type-constructor, тогда как когда мы используем его для обработчиков, мы ссылаемся на :<|> -the-data-constructor.

 Смежные вопросы

  • Нет связанных вопросов^_^