Tuyến tính không phải là một ràng buộc đủ để xác định một biểu diễn trạng thái duy nhất và vì vậy câu trả lời cho câu hỏi của bạn phụ thuộc vào cách bạn diễn giải logic tuyến tính theo trạng thái. Điều này thường sẽ được phản ánh trong cách bạn phải giải thích phương thức.!A
Nếu ngữ nghĩa dự định của các tham chiếu của bạn nói rằng tất cả các con trỏ là các giá trị duy nhất (nghĩa là có nhiều nhất một tham chiếu đến một đối tượng) thì các cấu trúc đồ thị và đồ thị không thể biểu thị được, vì lý do tautological mà một dag có thể chứa nhiều tham chiếu đến cùng một đối tượng. Trong trường hợp này , phải là một tính toán tạo ra giá trị mới của loại A , vì bạn muốn bản đồ δ A : ! Một ⊸ ! Một ⊗ ! A và ϵ A :!AAδA:!A⊸!A⊗!A .ϵA:!A⊸A
Tuy nhiên, giả sử rằng bạn muốn để đại diện cho chia sẻ . Sau đó, các đối tượng có thể được thu gom rác với việc đếm tham chiếu, với các bản đồ δ A : ! Một ⊸ ! Một ⊗ ! A và ϵ A : ! Một ⊸ Một có thể được thực hiện như hoạt động mà chỉ đụng đếm tham khảo. Trong trường hợp này, bạn không thể sử dụng tuyến tính để cho rằng luôn an toàn để thay đổi giá trị, vì có chia sẻ. Nhưng bạn có thể đảm bảo rằng tất cả việc cấp phát bộ nhớ đều rõ ràng trong chương trình của bạn và không có chu kỳ nào trong heap.!AδA:!A⊸!A⊗!AϵA:!A⊸A
Hầu hết các triển khai thực tế của các loại tuyến tính sử dụng cả hai cách giải thích này. Thay vào đó, các tài liệu tham khảo được xem như các thực thể có thể sao chép tự do và những gì chúng tôi theo dõi tuyến tính thực tế là khả năng . Khả năng không phải là giá trị thời gian chạy; chúng hoàn toàn là các thực thể khái niệm nhằm thể hiện sự cho phép truy cập một tài liệu tham khảo. Ý tưởng là bạn lập trình theo kiểu cho phép và vì vậy ngay cả khi có nhiều tham chiếu đến cùng một đối tượng, việc đọc hoặc sửa đổi một trạng thái chỉ có thể xảy ra nếu bạn cũng có khả năng truy cập nó. Và vì khả năng là tuyến tính, bạn biết rằng chỉ có bạn mới có thể thay đổi nó.
newgetsetcopy::::∀α.α⊸∃c:ι.cap(c)⊗ref(α,c)∀α,c:ι.cap(c)⊗ref(α,c)⊸α⊗cap(c)⊗ref(α,c)∀α,c:ι.cap(c)⊗ref( Α , c ) ⊗ α ⊸ c một p ( c ) ⊗ r e f( α , c )∀ α , c : ι .r e f( α , c ) ⊸ r e f( α , c ) ⊗ r e f( α , c )
Trong API được phác thảo ở trên, phạm vi trên ι , một số miền của các chỉ số thời gian biên dịch và phạm vi α trên các loại. Chúng ta có một loại c a p ( c ) là một khả năng được lập chỉ mục bởi c và một loại r e f ( α , c ) , là một loại tham chiếu đến α được truy cập bởi một khả năng c . Gọi g e t và s e t trên một tham chiếu yêu cầu khả năng c và gọi n ecιαc a p (c)cr e f( α , c )αcg e ts e tc tạo một tham chiếu mới và một khả năng mới chia sẻ một chỉ mục chung. Tuy nhiên, c o p y -ing một tài liệu tham khảo không yêu cầu quyền truy cập vào bất kỳ khả năng, vì vậy bất cứ ai có thể sao chép một tài liệu tham khảo miễn là họ không nhìn vào bên trong nó.n e wc o p y