Добрый (теория типов) - Kind (type theory)

В районе математическая логика и Информатика известный как теория типов, а своего рода это тип конструктор типов или, реже, тип оператор типа высшего порядка. Добрая система по сути просто типизированное лямбда-исчисление "на один уровень выше", наделенный примитивным типом, обозначается и называется "тип", что является разновидностью любого тип данных который не нуждается в параметры типа.

Вид иногда ошибочно описывается как «тип (тип данных ", но на самом деле это скорее арность спецификатор. Синтаксически естественно рассматривать полиморфные типы как конструкторы типов, поэтому неполиморфные типы нулевой конструкторы типов. Но все конструкторы с нулевым значением, а значит, и все мономорфные типы, имеют один и тот же самый простой вид; а именно .

Поскольку операторы типа высшего порядка в языки программирования, в большинстве программных практик виды используются, чтобы различать типы данных и типы конструкторов, которые используются для реализации параметрический полиморфизм. Виды появляются, явно или неявно, в языках, системы типов которых учитывают параметрический полиморфизм программно доступным способом, например C ++,[1] Haskell и Scala.[2]

Примеры

  • , произносится как "тип", это вид всех типы данных рассматривается как нулевой конструкторы типов, которые в этом контексте также называются собственными типами. Обычно сюда входят типы функций в функциональные языки программирования.
  • это своего рода унарный конструктор типов, например из тип списка конструктор.
  • это своего рода двоичный конструктор типа (через карри ), например из тип пары конструктор, а также конструктор тип функции конструктор (не путать с результатом его применения, который сам является типом функции, т.е. )
  • - это разновидность оператора типа высшего порядка от конструкторов унарных типов до соответствующих типов.[3]

Виды в Haskell

(Примечание: В документации Haskell одна и та же стрелка используется для типов и типов функций.)

Добрая система Haskell 98[4] включает ровно два вида:

  • произносится как «тип» - это вид всех типы данных.
  • это своего рода унарный конструктор типов, который принимает тип вида и производит своего рода вид .

Обитаемый тип (как правильные типы называются в Haskell) - это тип, который имеет значения. Например, игнорирование типовые классы которые усложняют картину, 4 это значение типа Int, пока [1, 2, 3] это значение типа [Int] (список Интов). Следовательно, Int и [Int] будь добр , но то же самое относится к любому типу функции, например Int -> Bool или даже Int -> Int -> Bool.

Конструктор типа принимает один или несколько аргументов типа и создает тип данных, когда предоставлено достаточно аргументов, т.е. он поддерживает частичное применение благодаря каррированию.[5][6] Вот как Haskell создает параметрические типы. Например, тип [] (список) является конструктором типа - он принимает один аргумент, чтобы указать тип элементов списка. Следовательно, [Int] (список Интов), [Плавать] (список поплавков) и даже [[Инт]] (список списков Ints) являются действительными приложениями [] конструктор типа. Следовательно, [] это тип своего рода . Потому что Int имеет добрый , применяя [] к этому приводит [Int], вроде . 2-кортеж конструктор (,) имеет добрый , конструктор из трех кортежей (,,) имеет добрый и так далее.

Добрый вывод

Стандартный Haskell не позволяет полиморфные виды. Это в отличие от параметрический полиморфизм на типах, который поддерживается в Haskell. Например, в следующем примере:

данные Дерево z  = Лист | Вилка (Дерево z) (Дерево z)

вид z может быть что угодно, в том числе , но также и т. д. Haskell по умолчанию всегда выводит типы как , если тип явно не указывает иное (см. ниже). Поэтому средство проверки типов отклонит следующее использование Дерево:

тип FunnyTree = Дерево []     -- инвалид

потому что вид [], не соответствует ожидаемому виду для z, что всегда .

Однако разрешены операторы типов более высокого порядка. Например:

данные Приложение не z = Z (не z)

имеет добрый , т.е. не ожидается, что это унарный конструктор данных, который применяется к своему аргументу, который должен быть типом, и возвращает другой тип.

GHC имеет расширение PolyKinds, который вместе с ВидПодпись, допускает полиморфные виды. Например:

данные Дерево (z :: k) = Лист | Вилка (Дерево z) (Дерево z)тип FunnyTree = Дерево []     -- OK

Начиная с GHC 8.0.1 типы и виды объединены.[7]

Смотрите также

Рекомендации

  • Пирс, Бенджамин (2002). Типы и языки программирования. MIT Press. ISBN  0-262-16209-1., глава 29, «Типовые операторы и Kinding»
  1. ^ «CS 115: Параметрический полиморфизм: функции шаблона». www2.cs.uregina.ca. Получено 2020-08-06.
  2. ^ Дженерики высшего вида
  3. ^ Пирс (2002), глава 32
  4. ^ Виды - Отчет Haskell 98
  5. ^ "Глава 4 Объявления и привязка". Отчет о языке Haskell 2010. Получено 23 июля 2012.
  6. ^ Миран, Липовача. «Выучи Haskell для большого блага!». Создание собственных типов и классов типов. Получено 23 июля 2012.
  7. ^ https://downloads.haskell.org/~ghc/8.0.1/docs/html/users_guide/glasgow_exts.html#ghc-flag--XTypeInType