Вид (теория типов)
В области математической логики и информатики , известной как теория типов , вид — это тип конструктора типа или, реже, тип оператора типа более высокого порядка . Система видов, по сути, представляет собой просто типизированное лямбда-исчисление «на уровень выше», наделенное примитивным типом, обозначаемым и называется «типом», который представляет собой тип любого типа данных , который не требует каких-либо параметров типа .
Вид иногда ошибочно описывают как «тип типа (данных) », но на самом деле это скорее спецификатор арности . Синтаксически естественно считать полиморфные типы конструкторами типов, а неполиморфные типы — конструкторами нулевых типов. Но все нульарные конструкторы, а значит, и все мономорфные типы, имеют один и тот же, самый простой вид; а именно .
Поскольку операторы типов высшего порядка редко встречаются в языках программирования , в большей части практики программирования виды используются для различения типов данных и типов конструкторов, которые используются для реализации параметрического полиморфизма . Виды появляются явно или неявно в языках, системы типов которых учитывают параметрический полиморфизм программно доступным способом, например C++ . [1] Хаскель и Скала . [2]
Примеры [ править ]
- , произносится как «тип», является разновидностью всех типов данных , которые рассматриваются как конструкторы нулевых типов и в этом контексте также называются правильными типами. Обычно сюда входят типы функций в функциональных языках программирования .
- является разновидностью конструктора унарного типа , например конструктора спискового типа .
- — это своего рода конструктор двоичного типа (через каррирование ), например, конструктор парного типа , а также конструктор типа функции (не путать с результатом его применения, который сам по себе является типом функции, то есть типа )
- — это своего рода оператор типа более высокого порядка, преобразующий конструкторы унарных типов в правильные типы. [3]
Виды в Haskell [ править ]
( Примечание : в документации Haskell используется одна и та же стрелка для типов и видов функций.)
Видовая система Haskell 98 [4] включает ровно два вида:
- , произносится как «тип» — это тип всех типов данных .
- это своего рода унарного конструктор типа , который принимает тип вида и производит тип вида .
Обитаемый тип (так в Haskell называются правильные типы) — это тип, который имеет значения. Например, игнорируя классы типов , которые усложняют картину, 4
это значение типа Int
, пока [1, 2, 3]
это значение типа [Int]
(список Ints). Поэтому, Int
и [Int]
иметь добрый , но то же самое относится и к любому типу функции, например Int -> Bool
или даже Int -> Int -> Bool
.
Конструктор типа принимает один или несколько аргументов типа и создает тип данных, когда предоставлено достаточное количество аргументов, т. е. он поддерживает частичное применение благодаря каррированию. [5] [6] Вот как Haskell создает параметрические типы. Например, тип []
(список) — это конструктор типа: для указания типа элементов списка требуется один аргумент. Следовательно, [Int]
(список Ints), [Float]
(список поплавков) и даже [[Int]]
(список списков целых чисел) являются допустимыми приложениями []
конструктор типов. Поэтому, []
это тип рода . Потому что Int
имеет вид , применяя []
к этому приводит [Int]
, типа . 2- кортежный конструктор (,)
имеет вид , трехкортежный конструктор (,,)
имеет вид и так далее.
Добрый вывод [ править ]
Стандартный Haskell не допускает полиморфных типов . В этом отличие от параметрического полиморфизма типов, который поддерживается в Haskell. Например, в следующем примере:
data Tree z = Leaf | Fork (Tree z) (Tree z)
вид z
может быть что угодно, в том числе , но и и т. д. Haskell по умолчанию всегда будет определять типы, которые будут , если тип явно не указывает иное (см. ниже). Поэтому программа проверки типов отклонит следующее использование Tree
:
type FunnyTree = Tree [] -- invalid
потому что вид []
, не соответствует ожидаемому виду для z
, что всегда .
Однако разрешены операторы типов более высокого порядка. Например:
data App unt z = Z (unt z)
имеет вид , то есть unt
ожидается, что это унарный конструктор данных, который применяется к своему аргументу, который должен быть типом, и возвращает другой тип.
GHC имеет расширение PolyKinds
, который вместе с KindSignatures
, допускает полиморфные виды. Например:
data Tree (z :: k) = Leaf | Fork (Tree z) (Tree z)
type FunnyTree = Tree [] -- OK
Начиная с GHC 8.0.1, типы и виды объединены. [7]
См. также [ править ]
Ссылки [ править ]
- Пирс, Бенджамин (2002). Типы и языки программирования . МТИ Пресс. ISBN 0-262-16209-1 . , глава 29, «Операторы типов и сортировка»
- ^ «CS 115: Параметрический полиморфизм: функции шаблона» . www2.cs.uregin.ca . Проверено 6 августа 2020 г.
- ^ «Дженериксы высшего типа» (PDF) . Архивировано из оригинала (PDF) 10 июня 2012 г. Проверено 10 июня 2012 г.
- ^ Пирс (2002), глава 32
- ^ Виды - Отчет Haskell 98
- ^ «Глава 4. Объявления и обязательность» . Отчет о языке Haskell 2010 . Проверено 23 июля 2012 г.
- ^ Миран, Липовача. «Изучите Haskell во благо!» . Создание собственных типов и классов типов . Проверено 23 июля 2012 г.
- ^ «9.1. Параметры языка — Руководство пользователя компилятора Glasgow Haskell» .