Структури даних в мові програмування з лінійними типами


15

Припустимо, що ми маємо справу з мовою програмування, яка має підтримку лінійних типів (терміни лінійного типу можуть бути використані не більше одного разу, так би мовити). Це дозволяє обробляти деякі обчислювальні ефекти (такі як мутація, навіть зміна типу операнду) таким чином, що є проблематичним для мов, системи типів яких функціонують лише на "вічних істинах".

Багато структур даних можна охарактеризувати за допомогою індуктивних типів (списки та дерева - канонічні приклади). Якщо додати до суміші лінійні індуктивні типи, ми можемо також обробляти зміни даних, що змінюються.

Однак мені незрозуміло, як представляти структури даних, які демонструють обмін та циклічні посилання на мові програмування з лінійними типами (приклади таких структур даних - це DAG та інші графіки, представлені списками суміжності або чимось іншим, циклічними списками). Чи можемо ми це зробити? Якщо це неможливо, яким чином ми повинні розширити мову, щоб розмістити такі структури даних?

Найпопулярніший приклад, який я знайшов поки що, - це подвійно пов'язаний список. Є інші приклади?

Відповіді:


20

Лінійність не є достатнім обмеженням для закріплення унікального репрезентативного стану, тому відповідь на ваше запитання залежить від того, як ви інтерпретуєте лінійну логіку з точки зору стану. Це, як правило , відбивається в тому , як ви повинні інтерпретувати модальність.!A

Якщо ваша передбачувана семантика посилань говорить про те, що всі покажчики є унікальними значеннями (тобто, максимум, є одне посилання на об’єкт), то даги та структури графів не є виразними через тавтологічну причину того, що даг може містити кілька посилань на той самий об’єкт. В цьому випадку Повинен бути обчислення , яке створює нове значення типу , так як ви хочете MAPS І .A!AAΕ : ! А АδA:!A!A!AϵA:!AA

Однак припустимо, що ви хочете представляти спільний доступ . Тоді об’єкти можна збирати сміттям з підрахунком посилань, з картами і може бути реалізована як операції, які просто підбивають підрахунки посилань. У цьому випадку ви не можете використовувати лінійність, щоб припустити, що мутувати значення завжди безпечно, оскільки це спільний доступ. Але ви можете переконатися, що все розподіл пам’яті є явним у вашій програмі та відсутність циклів у купі.Δ : ! А ! А ! Ε : ! А А!AδA:!A!A!AϵA:!AA

Більшість практичних реалізацій лінійних типів не використовують жодної з цих двох інтерпретацій. Натомість посилання розглядаються як вільно дублюються об'єкти, і те, що ми відстежуємо лінійно, насправді є можливостями . Можливості не є значеннями виконання; вони суто концептуальні утворення, які призначені для представлення дозволу на доступ до посилання. Ідея полягає в тому, що ви програмуєте в стилі передачі дозволу, і тому навіть якщо є багато посилань на один і той же об'єкт, читання або зміна фрагмента стану може відбуватися лише в тому випадку, якщо ви також маєте можливість отримати доступ до нього. А оскільки здатність лінійна, ви знаєте, що змінити її можете лише ви.

new:α.αc:ι.cap(c)ref(α,c)get:α,c:ι.cap(c)ref(α,c)αcap(c)ref(α,c)set:α,c:ι.cap(c)ref(α,c)αcap(c)ref(α,c)copy:α,c:ι.ref(α,c)ref(α,c)ref(α,c)

У накресленому вище API, становить діапазон над , деяким доменом індексів часу компіляції та діапазонами для типів. У нас є тип який є функцією, індексованою , і тип , який є типом посилань на до яких звертається з можливістю . Для виклику та за посиланням потрібна можливість , а виклик створює нову посилання та нову можливість спільного використання індексу. Однакι α c a p ( c ) c r e f ( α , c ) α c g e t s e t c n e w c o p ycιαcap(c)cref(α,c)αcgetsetcnewcopy-введення посилання не вимагає доступу до будь-яких можливостей, тому кожен може скопіювати посилання до тих пір, поки не загляне всередину.


Дякую за продуману відповідь. Мене все ж цікавить, чи існує (технічна) відмінність між псевдонімом та спільним доступом? Чи є які-небудь системи, які можуть поступово переходити від лінійних (щонайбільше однієї посилання) до спільних, щонайменше, n посилань, до спільних без обмежень?

1
1. Згладжування та обмін - синоніми. 2. Так, інтерпретації стилю спроможності, доповнені дробовими дозволами Бойленда, це дозволяють. Дивіться також нещодавню роботу Поттьє з питань розрахунків можливостей для теорії, а також роботи Олдріха та Біргофа над множиною для впровадження.
Neel Krishnaswami
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.