Thuật ngữ có thể hơi khó hiểu nhưng vâng, có hai ngôn ngữ trong ví dụ "Khái niệm tính toán là đơn nguyên" của Moggi (liên kết miễn phí tại đây: https://core.ac.uk/doad/pdf/21173011.pdf ).
Trong bài báo đó, các ngôn ngữ được gọi là , ngôn ngữ kim loại và là "ngôn ngữ lập trình". Tôi tin rằng
đóng vai trò của phép tính lambda tính toán nhưng tôi có thể bị nhầm. Một khía cạnh khó hiểu là cả hai ngôn ngữ đều có hàm tạo kiểu rõ ràng đại diện cho đơn nguyên, nhưng chúng được sử dụng khác nhau.λmlλplλplT
λml là ngôn ngữ "thuần túy" với đơn âm , nghĩa là mọi thao tác của đơn vị đều rõ ràng trong các loại và loại chức năng là loại hàm thuần túy. Quan sát quy tắc liên kết (từ hình 3 trên trang 9):Tτ1→τ2
x:τ⊢mle1:Tτ1x1:τ1⊢mle2:Tτ2x:τ⊢mlletTx1⇐e1ine2:Tτ2
e1 và được nhập rõ ràng dưới dạng các điều khoản của
để đánh dấu rằng chúng có hiệu lực. Mỗi biểu hiện hiệu quả thực sự là một thuật ngữ thuần túy với loại đơn âm. Điều này tương tự như cách chúng ta lập trình với các đơn vị trong Haskell trong đó Haskell đóng vai trò của ngôn ngữ kim loại và đơn vị mã hóa các hiệu ứng nhưng thực sự chúng ta luôn thao túng các thuật ngữ "thuần túy" (tôi đặt "thuần túy" trong trích dẫn vì Haskell có hiệu ứng phân kỳ riêng và lỗi).e2Tτ1,Tτ2
Chúng ta có thể thấy điều này trong ngữ nghĩa của ngôn ngữ kim loại: thuật ngữ biểu thị một hình thái , đơn nguyên không phát sinh trừ khi chúng ta đề cập đến nó.x:τ⊢mle:τ′[τ]→[τ′]
Mặt khác, được dự định là một ngôn ngữ lập trình gọi theo giá trị hiệu quả. Như một thuật ngữ là một thuật ngữ có thể có hiệu lực trả về các giá trị của loại , tương tự như các ngôn ngữ như SML và OCaml. Đó là lý do tại sao trong bài báo, loại chức năng được viết vì đây là loại chức năng có hiệu lực, không phải là chức năng thuần túy.λplx:τ⊢ple:τ′τ′τ⇀τ′
So sánh quy tắc liên kết tại đây (từ hình 5 trên trang 11):
x:τ⊢ple1:τ1x1:τ1⊢ple2:τ2x:τ⊢plletx1⇐e1ine2:τ2
e2x:τ⊢ple:τ′[τ]→T[τ′]
λplTTaunit -> a
->