Simon về cơ bản là chính xác, từ quan điểm mở rộng. Chúng ta biết khá rõ ngữ nghĩa của các ngôn ngữ chức năng hiện đại là gì và chúng thực sự là những biến thể tương đối nhỏ của nhau - mỗi ngôn ngữ đại diện cho các bản dịch hơi khác nhau thành một ngôn ngữ kim loại đơn âm. Ngay cả một ngôn ngữ như Scheme (một ngôn ngữ mệnh lệnh bậc cao được gõ động với điều khiển hạng nhất) cũng có một ngữ nghĩa khá gần với ML và Haskell.
Từ quan điểm của denotational xem, bạn có thể bắt đầu bằng cách đưa ra một phương trình miền khá đơn giản đối với ngữ nghĩa của Đề án - gọi nó là . Mọi người có thể và đã giải các phương trình như thế này vào cuối thập niên 70 / đầu thập niên 80, vì vậy điều này không quá tệ. Tương tự, có những ngữ nghĩa hoạt động tương đối đơn giản cho Scheme. (Lưu ý rằng khi tôi nói "Lược đồ", ý tôi là phép tính lambda chưa được cộng với trạng thái tiếp diễn cộng với trạng thái, trái ngược với Đề án thực tế có một vài mụn cóc như tất cả các ngôn ngữ thực sự làm.)V
Nhưng để có được một thể loại phù hợp để diễn giải các ngôn ngữ chức năng được gõ hiện đại, mọi thứ trở nên khá đáng sợ. Về cơ bản, bạn kết thúc việc xây dựng một thể loại làm giàu siêu ma trận về các mối quan hệ tương đương một phần trên miền này. (Ví dụ, xem "Ngữ nghĩa thực tế của đa hình tham số, tham chiếu chung và các loại đệ quy" của Birkedal, Stovring và Thamsborg.). Những người thích ngữ nghĩa hoạt động đều biết công cụ này là quan hệ logic được lập chỉ mục từng bước. (Ví dụ, xem "Độc lập đại diện phụ thuộc nhà nước" của Ahmed, Dreyer và Rossberg.) Dù sao đi nữa, các kỹ thuật được sử dụng là tương đối mới.
Lý do cho sự phức tạp toán học này là chúng ta cần có khả năng giải thích đa hình tham số và trạng thái bậc cao hơn cùng một lúc. Nhưng một khi bạn đã làm điều này, về cơ bản bạn không có nhà, vì công trình này chứa tất cả các bit cứng. Bây giờ, bạn có thể giải thích các loại ML và Haskell thông qua các bản dịch đơn âm thông thường. Không gian chức năng nghiêm ngặt, hiệu quả của ML a -> b
chuyển thành <a \ right> và không gian chức năng lười biếng của Haskell chuyển thành <a \ right> , với loại tác dụng phụ đơn nguyên diễn giải đơn vị IO của Haskell và là cách hiểu của loại ML hoặc Haskell và⟨ một ⟩ → ⟨ b ⟩ T ( Một ) ⟨ một ⟩ →⟨ Một ⟩ → T⟨ B ⟩⟨ Một ⟩ → ⟨ b ⟩T( A )⟨ Một ⟩a
→ là số mũ trong danh mục PER đó.
Theo như lý thuyết phương trình, vì cả hai ngôn ngữ này đều có thể được mô tả bằng các bản dịch thành các tập con hơi khác nhau của cùng một ngôn ngữ, nên hoàn toàn công bằng khi gọi chúng là các biến thể cú pháp của nhau.
Sự khác biệt về cảm nhận giữa ML và Haskell thực sự phát sinh từ các thuộc tính cường độ của hai ngôn ngữ - đó là thời gian thực hiện và mức tiêu thụ bộ nhớ. ML có một mô hình hiệu suất thành phần (nghĩa là chi phí thời gian / không gian của chương trình có thể được tính từ chi phí thời gian / không gian của các bộ con của nó), giống như một ngôn ngữ gọi bằng tên thật. Haskell thực tế được triển khai với nhu cầu gọi, một loại ghi nhớ và kết quả là hiệu suất của nó không phải là thành phần - thời gian một biểu thức bị ràng buộc với một biến sẽ đánh giá tùy thuộc vào việc nó đã được sử dụng trước đó hay chưa. Điều này không được mô hình hóa trong ngữ nghĩa mà tôi đã đề cập ở trên.
Nếu bạn muốn thực hiện các thuộc tính nghiêm túc hơn, thì ML và Haskell bắt đầu cho thấy sự khác biệt nghiêm trọng hơn. Có lẽ vẫn có thể nghĩ ra một ngôn ngữ kim loại phổ biến cho họ, nhưng việc giải thích các loại sẽ khác nhau theo một cách có hệ thống hơn nhiều, liên quan đến ý tưởng lý thuyết chứng minh về sự tập trung . Một nơi tốt để tìm hiểu về điều này là luận án tiến sĩ của Noam Zeilberger.