Kết quả bạn đang tìm kiếm nguồn gốc từ tham số Reynolds ', và được hiển thị nổi tiếng nhất bởi Wadler trong theorems for free.
Cách thanh lịch nhất để chứng minh các kết quả tham số cơ bản mà tôi đã thấy sử dụng khái niệm "Loại Singleton". Về cơ bản, đưa ra bất kỳ ADT
data Nat = Zero | Succ Nat
có tồn tại một gia đình được lập chỉ mục (còn được gọi là GADT)
data SNat n where
SZero :: SNat Zero
SSucc :: SNat n -> SNat (Succ n)
và chúng tôi có thể cung cấp một ngữ nghĩa ngôn ngữ của mình bằng cách "xóa" tất cả các loại đến một untyped ngôn ngữ như vậy mà Nat
và SNat
xóa cùng một điều. Sau đó, theo các quy tắc gõ của ngôn ngữ
id (x :: SNat n) :: SNat n
SNat n
đã chỉ có một cư dân (singleton của nó), vì ngữ nghĩa được đưa ra bởi tẩy xoá, chức năng có thể không sử dụng các loại lập luận của họ, do đó giá trị chỉ được trả lại từ id
trên bất kỳ Nat
là số bạn đã cung cấp. Lập luận cơ bản này có thể được mở rộng để chứng minh hầu hết các kết quả tham số và được Karl Crary sử dụng trong A Simple Proof Technique for Parametricity Results mặc dù bản trình bày mà tôi có ở đây được lấy cảm hứng từ Stone and Harper
Nguồn
2012-11-27 06:05:50
Để trở nên phổ biến, tôi nghĩ mọi người thường nói rằng 'id' là chỉ có chức năng 'thú vị' hoặc 'tổng' của loại 'a-> a'. 'undefined' có thể là kiểu * bất kỳ * trong Haskell, nhưng nó không phải là một hàm hữu ích. Bạn cũng có thể quan tâm Djinn, một chương trình tạo ra các chức năng từ một kiểu khi có thể, http://lambda-the-ultimate.org/node/1178 –
@JohnL Djinn không thực sự chứng minh tính độc đáo, phải không? Nó chỉ tìm thấy một số chức năng của loại đó nếu nó tồn tại. –
Câu hỏi này có thể phù hợp hơn với http://cs.stackexchange.com – Heatsink