Полиморфизм строк

Вид полиморфизма

В теории типов языков программирования полиморфизм строк — это разновидность полиморфизма , которая позволяет писать программы, полиморфные по типам строк, таким как типы записей и полиморфные варианты. [1] Система полиморфных типов строк и доказательство вывода типов были введены Митчеллом Вандом . [2] [3]

Определение типа записи полиморфной строки

Строково-полиморфный тип записи определяет список полей с соответствующими им типами, список отсутствующих полей и переменную, указывающую на отсутствие или наличие произвольных дополнительных полей. Оба списка являются необязательными, а переменная может быть ограничена. В частности, переменная может быть «пустой», указывая на то, что для записи не может быть дополнительных полей.

Может быть записано как . Это указывает на тип записи, который имеет поля с соответствующими типами (для ), и не имеет ни одного из полей (для ), при этом выражает тот факт, что запись может содержать другие поля, кроме . { 1 : T 1 , , n : T n , absent ( f 1 ) , , absent ( f m ) , ρ } {\displaystyle \{\ell _{1}:T_{1},\dots ,\ell _{n}:T_{n},{\text{absent}}(f_{1}),\dots ,{\text{absent}}(f_{m}),\rho \}} i {\displaystyle \ell _{i}} T i {\displaystyle T_{i}} i = 1 n {\displaystyle i=1\dots n} f j {\displaystyle f_{j}} j = 1 m {\displaystyle j=1\dots m} ρ {\displaystyle \rho } i {\displaystyle \ell _{i}}

Строково-полиморфные типы записей позволяют нам писать программы, которые работают только с разделом записи. Например, можно определить функцию, которая выполняет некоторое двумерное преобразование, которое принимает запись с двумя или более координатами и возвращает идентичный тип:

      transform2d  : { x :  Number  , y :  Number  , ρ }  { x :  Number  , y :  Number  , ρ }   {\displaystyle {\text{transform2d}}:\{x:{\text{Number}},y:{\text{Number}},\rho \}\to \{x:{\text{Number}},y:{\text{Number}},\rho \}} 

Благодаря полиморфизму строк функция может выполнять двумерное преобразование в трехмерной (фактически, n -мерной) точке, оставляя координату z (или любые другие координаты) нетронутой. В более общем смысле функция может выполняться в любой записи, содержащей поля и с типом . Потери информации не происходит: тип гарантирует, что все поля, представленные переменной, присутствуют в возвращаемом типе. Напротив, определение типа выражает тот факт, что запись этого типа имеет ровно поля и и ничего больше. В этом случае получается классический тип записи. x {\displaystyle x} y {\displaystyle y} Number {\displaystyle {\text{Number}}} ρ {\displaystyle \rho } { x : Number , y : Number , e m p t y } {\displaystyle \{x:{\text{Number}},y:{\text{Number}},\mathbf {empty} \}} x {\displaystyle x} y {\displaystyle y}

Операции по набору текста на записях

Операциям записи выбора поля , добавления поля и удаления поля можно присвоить строково-полиморфные типы. r . {\displaystyle r.\ell } r [ := e ] {\displaystyle r[\ell :=e]} r {\displaystyle r\backslash \ell }

s e l e c t = λ r . ( r . ) : { : T , ρ } T {\displaystyle \mathrm {select_{\ell }} =\lambda r.(r.\ell )\;:\;\{\ell :T,\rho \}\rightarrow T}

a d d = λ r . λ e . r [ := e ] : { a b s e n t ( ) , ρ } T { : T , ρ } {\displaystyle \mathrm {add_{\ell }} =\lambda r.\lambda e.r[\ell :=e]\;:\;\{\mathrm {absent} (\ell ),\rho \}\rightarrow T\rightarrow \{\ell :T,\rho \}}

r e m o v e = λ r . r : { : T , ρ } { a b s e n t ( ) , ρ } {\displaystyle \mathrm {remove_{\ell }} =\lambda r.r\backslash \ell \;:\;\{\ell :T,\rho \}\rightarrow \{\mathrm {absent} (\ell ),\rho \}}

Примечания

  1. ^ "OCaml - Полиморфные варианты". v2.ocaml.org . Получено 2022-12-03 .
  2. ^ Ванд, Митчелл (июнь 1989). «Вывод типа для конкатенации записей и множественного наследования». Труды. Четвертый ежегодный симпозиум по логике в информатике . стр. 92–97. doi :10.1109/LICS.1989.39162.
  3. ^ Wand, Mitchell (1991). «Вывод типа для конкатенации записей и множественного наследования». Информация и вычисления . 93 (Избранное из симпозиума IEEE 1989 года по логике в компьютерной науке): 1–15. doi :10.1016/0890-5401(91)90050-C. ISSN  0890-5401.
Retrieved from "https://en.wikipedia.org/w/index.php?title=Row_polymorphism&oldid=1205030027"