Các loại phổ quát là một loại phụ, hoặc trường hợp đặc biệt, của các loại tồn tại?


20

Tôi muốn biết liệu loại : T a = X : { a X , f : X { T , F } } là loại phụ, hoặc trường hợp đặc biệt, được định lượng theo kiểu tồn tại loại T e có cùng chữ ký: T e = X : { a X , f : X { T , F } }Ta

Ta=X:{aX,f:X{T,F}}
Te
Te=X:{aX,f:X{T,F}}

Tôi muốn nói "yes": Nếu một cái gì đó là đúng "cho tất cả X" ( ), sau đó nó cũng phải là sự thật "đối với một số X" ( X ). Đó là, một tuyên bố với ' ' chỉ đơn giản là một phiên bản hạn chế hơn về báo cáo kết quả tương tự với ' ': X , P ( X ) ?XX

X,P(X)?X,P(X).

Tôi có sai ở đâu không?

Bối cảnh: Tại sao tôi hỏi điều này?

Tôi đang nghiên cứu các loại hiện sinh để tìm hiểu lý do và cách thức "Các loại [Dữ liệu] Trừu tượng có Loại Hiện sinh" . Tôi không thể nắm bắt tốt khái niệm này từ lý thuyết một mình; Tôi cũng cần những ví dụ cụ thể.

Thật không may, các ví dụ mã tốt rất khó tìm vì hầu hết các ngôn ngữ lập trình chỉ hỗ trợ hạn chế cho các kiểu tồn tại. (Ví dụ: các ký tự đại diện của Haskellforall hoặc Java? .) Mặt khác, các loại được định lượng toàn cầu được hỗ trợ bởi nhiều ngôn ngữ gần đây thông qua "generic".

Tệ hơn nữa, thuốc generic dường như cũng dễ dàng bị lẫn lộn với các loại tồn tại , khiến cho việc phân biệt tồn tại với các loại phổ quát càng khó hơn. Tôi tò mò tại sao sự pha trộn này xảy ra dễ dàng như vậy. Một câu trả lời cho câu hỏi này có thể giải thích cho nó: Nếu các loại phổ quát thực sự chỉ là một trường hợp đặc biệt của các loại tồn tại, thì không có gì lạ khi các loại chung, ví dụ như Java List<T>, có thể được hiểu theo một trong hai cách.


1
Điều gì thậm chí là sự khác biệt giữa phổ quát và hiện sinh?

Về mặt toán học, bạn đã đúng: Nếu forall x. P(x)sau đó exists x. P(x). Cho dù các hệ thống loại có tính đến điều này khi kiểm tra các loại ... Tôi không biết. +1 cho một câu hỏi thú vị.

1
@deinan: Nếu P (x) không giữ cho bất kỳ x , thì chắc chắn xP (x) không giữ. Điều bạn có thể có nghĩa là khi không có x , đó là x∈XP (x) không ngụ ý ∃x∈XP (x) nếu X = .

1
... Và lưu ý rằng, nếu chúng được viết lại mà không đặt ký hiệu, chúng sẽ trông khác nhau: ∀xx∈X⇒P (x) so với ∃xx∈X & P (x)xx∈X⇒P (x) sẽ được trivially hài lòng bởi bất kỳ x không phải từ x .

1
Câu hỏi hay. Trong Haskell, chắc chắn đúng là một giá trị của loại (forall b. Show b => b) có thể được chuyển đến một hàm lấy (forall b. B), nhưng ngược lại, ngụ ý khả năng thay thế mà bạn mong đợi một mối quan hệ phụ. Nhưng tất nhiên khi bạn nói về các loại bạn nên đề cập đến hệ thống loại bạn đang xem xét, đặc biệt nếu bạn có một đại số loại chính thức trong ngữ nghĩa của bạn ...

Câu trả lời:


10

x:T,P(x)x:T,P(x)T

(x:T,P(x))(x:T,P(x))TaTe

Ta=X.{a:X,f:Xbool}AA(M)M:XM1M2XA(M1)A(M2)Ta

Te=X.{a:X,f:Xbool}BTeN:Xπ1(B)=Nπ2(B)={a:N,f:Nbool}N

Đừng hiểu lầm bởi Haskell forall: mặc dù tên của nó, đó là một dạng của bộ lượng hóa hiện sinh.

Về nền tảng, tôi đặc biệt khuyến nghị các loại và ngôn ngữ lập trình (chương 23 và 24 thảo luận về các loại phổ quát và các loại tồn tại tương ứng). Nó sẽ cung cấp nền tảng hữu ích để hiểu các bài báo nghiên cứu.


1
Một vấn đề nhỏ, và khá muộn, phân biệt - Haskell forallthực sự là một bộ định lượng phổ quát trong bối cảnh ban đầu của định lượng ngầm mà nó đưa ra rõ ràng, cụ thể là xem các loại đa hình "từ bên ngoài" cho các định nghĩa cấp cao nhất. Trên "bên trong" của một định nghĩa như vậy, khi thao tác các đối số, các kiểu đa hình có hiệu quả tồn tại; mỗi biến loại được liên kết với một số loại, nhưng chúng tôi không (và không thể) biết loại đó là gì. Theo hiểu biết của tôi, không có triển khai Haskell nào hỗ trợ các kiểu tồn tại thực sự (thô, cấp cao nhất) và tôi không rõ mục đích nào sẽ phục vụ.
CA McCann

1
Các loại tồn tại được hỗ trợ bởi GHC là các loại (trực tiếp hoặc gián tiếp) có các bộ lượng tử phổ, nhìn từ "bên ngoài", xảy ra ở vị trí chống chỉ định. Điều này sử dụng tính hai mặt tương tự như phủ định logic, do đó, để có các kiểu tồn tại như vậy ở cấp cao nhất, chúng phải được chống lại gấp đôi, sử dụng mã hóa giống như CPS (đây là mã tương đương mà Uday Reddy đưa ra). Lưu ý rằng các bộ lượng hóa hiện sinh trong trực giác hiện tại bất tiện tương tự cho các lý do tương tự.
CA McCann

5

X.P(X)X.P(X)

X.(X×(XBool))XX.(X×(XBool))

 f (p: \forall X. (X * (X -> Bool))) = PACK X = Bool WITH p[Bool]

Bài viết bạn đề cập cho các loại hiện sinh là một chút lý thuyết. Một bài viết hướng dẫn nhiều hơn là bài viết của Cardelli và Wegner: Về cách hiểu các loại, trừu tượng hóa dữ liệu và đa hình . Hầu hết các sách giáo khoa nâng cao về ngôn ngữ lập trình cũng sẽ có một số thảo luận về các loại hiện sinh. Một cuốn sách hay để tìm kiếm sẽ là Cơ sở Ngôn ngữ Lập trình của Mitchell .

Bạn đúng rằng hầu hết các ngôn ngữ lập trình không có kiểu tồn tại rõ ràng. Tuy nhiên, nhiều người có các loại trừu tượng (hoặc bằng một số tên khác như "gói" hoặc "mô-đun"). Vì vậy, chúng có thể biểu thị các giá trị của các kiểu tồn tại, mặc dù chúng không coi các giá trị đó là các thực thể hạng nhất.

X.P(X)Y.(X.P(X)Y)Y

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.