Лінійність не є достатнім обмеженням для закріплення унікального репрезентативного стану, тому відповідь на ваше запитання залежить від того, як ви інтерпретуєте лінійну логіку з точки зору стану. Це, як правило , відбивається в тому , як ви повинні інтерпретувати модальність.! А
Якщо ваша передбачувана семантика посилань говорить про те, що всі покажчики є унікальними значеннями (тобто, максимум, є одне посилання на об’єкт), то даги та структури графів не є виразними через тавтологічну причину того, що даг може містити кілька посилань на той самий об’єкт. В цьому випадку Повинен бути обчислення , яке створює нове значення типу , так як ви хочете MAPS І .A! ААΕ : ! А ⊸ АδА: ! А ⊸ ! А ⊗ ! АϵА: ! А ⊸ А
Однак припустимо, що ви хочете представляти спільний доступ . Тоді об’єкти можна збирати сміттям з підрахунком посилань, з картами і може бути реалізована як операції, які просто підбивають підрахунки посилань. У цьому випадку ви не можете використовувати лінійність, щоб припустити, що мутувати значення завжди безпечно, оскільки це спільний доступ. Але ви можете переконатися, що все розподіл пам’яті є явним у вашій програмі та відсутність циклів у купі.Δ : ! А ⊸ ! А ⊗ ! Ε : ! А ⊸ А! АδА: ! А ⊸ ! А ⊗ ! АϵА: ! А ⊸ А
Більшість практичних реалізацій лінійних типів не використовують жодної з цих двох інтерпретацій. Натомість посилання розглядаються як вільно дублюються об'єкти, і те, що ми відстежуємо лінійно, насправді є можливостями . Можливості не є значеннями виконання; вони суто концептуальні утворення, які призначені для представлення дозволу на доступ до посилання. Ідея полягає в тому, що ви програмуєте в стилі передачі дозволу, і тому навіть якщо є багато посилань на один і той же об'єкт, читання або зміна фрагмента стану може відбуватися лише в тому випадку, якщо ви також маєте можливість отримати доступ до нього. А оскільки здатність лінійна, ви знаєте, що змінити її можете лише ви.
н е шг е тс е тc o p y::::∀ α .α ⊸ ∃ c : ι . c a p ( c ) ⊗ r e f( α , c )∀ α , c : ι .c a p (c)⊗ r e f( α , c ) ⊸ α ⊗ c a p ( c ) ⊗ r e f( α , c )∀ α , c : ι .c a p (c)⊗ r e f( α , c ) ⊗ α ⊸ c a p ( c ) ⊗ r e f( α , c )∀ α , c : ι .r e f( α , c ) ⊸ r e f( α , c ) ⊗ r e f( α , 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ιαc a p (c)cr e f( α , c )αcг е тс е тcн е шc o p y-введення посилання не вимагає доступу до будь-яких можливостей, тому кожен може скопіювати посилання до тих пір, поки не загляне всередину.