2012-03-15 27 views
12

Tôi đang triển khai thuật toán suy luận kiểu Hindley-Milner, theo các hướng dẫn của Mark JonesOleg Kiselyov. Cả hai có một "áp dụng cam kết ràng buộc" hoạt động với một loại xấp xỉ của mẫuThuật toán Hindley-Milner: sử dụng các loại để đảm bảo ràng buộc được áp dụng

applyBindings :: TyEnv -> Type -> Type 

mà áp dụng tyvar -> ty bindings trong TyEnv đến Type nhất định. Tôi đã tìm thấy nó một sai lầm phổ biến trong mã của tôi để quên gọi applyBindings và tôi không nhận được sự trợ giúp từ hệ thống kiểu của Haskell, vì ty có cùng loại với applyBindings tyenv ty. Tôi đang tìm kiếm một cách để thực thi bất biến sau đây trong hệ thống kiểu:

khi thực hiện kiểu suy luận, các ràng buộc phải được áp dụng trước khi trở về một 'chính thức' kết quả

Khi làm suy luận kiểu cho một monomorphic ngôn ngữ đối tượng, có một cách tự nhiên để thực hiện điều này, như thực hiện trong Wren ng thornton của unification-fd package: chúng ta định nghĩa hai kiểu dữ liệu cho Type s:

-- | Types not containing unification variables 
type Type = ...   -- (Fix TypeF) in wren's package 

-- | Types possibly containing unification variables 
type MutType = ...  -- (MutTerm IntVar TypeF) in wren's package 

và cung cấp cho applyBindings loại

-- | Apply all bindings, returning Nothing if there are still free variables 
-- otherwise just 
applyBindings :: TyEnv -> MutType -> Maybe Type 

(chức năng này thực sự là freeze . applyBindings trong hợp nhất-fd). Điều này thực thi bất biến của chúng ta - nếu chúng ta quên applyBindings, thì chúng ta sẽ gặp lỗi kiểu.

Đây là loại giải pháp mà tôi đang tìm kiếm, nhưng đối với các ngôn ngữ đối tượng có tính đa hình. Cách tiếp cận trên, không áp dụng, vì các kiểu ngôn ngữ của chúng ta có thể có các biến kiểu - thực sự, nếu có biến miễn phí sau khi áp dụng các ràng buộc, chúng ta không muốn trả về Nothing, nhưng chúng ta muốn khái quát hóa qua các biến này.

Có giải pháp nào dọc theo các dòng tôi mô tả, tức là giải pháp cho phép applyBindings loại khác từ const id? Làm trình biên dịch thực sự sử dụng cùng một punning (giữa các biến thống nhất và biến kiểu ngôn ngữ đối tượng) mà Mark và Oleg của hướng dẫn làm gì?

+3

Khi bạn nói khái quát hóa các biến đó, bạn có muốn không lấy lại loại, nhưng là lược đồ kiểu? tức là, khái niệm một hàm từ các biến đến một kiểu? Trong trường hợp đó, bạn sẽ có thể tạo sự khác biệt về khái niệm giữa các biến loại miễn phí và các biến loại được định lượng theo, ví dụ:, một forall, cũng giống như một phân biệt ở mức giá trị giữa các đoạn cú pháp có chứa các biến miễn phí, và các biểu thức trong đó tất cả các biến được giới thiệu bởi lambdas. – sclv

Trả lời

5

Tôi đang tham gia một đâm trong bóng tối ở đây, bởi vì tôi nghĩ rằng có thể có những vấn đề khác với các giải pháp bạn đề xuất, nhưng tôi có thể giải quyết ít nhất một khó khăn:

  • kiểm tra kiểu của bạn nên có các đại diện khác nhau cho biến loại hợp nhấtbiến loại ngôn ngữ đối tượng.

Biến thể này không khó thực hiện và trên thực tế, tôi cho rằng trình kiểm tra loại GHC hoạt động theo cách này, ít nhất một lần. Bạn có thể muốn kiểm tra giấy Practical Type Inference for Arbitrary-Rank Types; phụ lục chứa rất nhiều mã rất hữu ích.

+0

Tuyệt vời, cảm ơn vì liên kết đó - nó đã làm cho tôi thấy rõ sự khác biệt giữa các biến kiểu ngôn ngữ meta và biến kiểu ngôn ngữ đối tượng. Tôi nhận thấy rằng các tác giả không phân biệt trong hệ thống kiểu giữa "các kiểu có thể có' MetaTv 'trong chúng" và "kiểu không thể" (ví dụ, 'định lượng :: [MetaTv] -> Rho -> Tc Sigma' sẽ trả về một kiểu mà không có '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Có bất kỳ giấy tờ nào tạo sự khác biệt như vậy không? – reinerp

Các vấn đề liên quan