Một mô tả toán học (phân loại) của các lớp loại


14

Một ngôn ngữ chức năng có thể được xem như là một thể loại trong đó các đối tượng của nó là các loại và các hình thái chức năng giữa chúng.

Làm thế nào để các lớp loại phù hợp trong mô hình này?

Tôi giả sử chúng ta chỉ nên xem xét những triển khai đó thỏa mãn các ràng buộc mà hầu hết các lớp loại có, nhưng điều đó không được thể hiện trong Haskell. Ví dụ, chúng ta chỉ nên xem xét những triển khai Functorđó fmap id ≡ idfmap f . fmap g ≡ fmap (f . g).

Hoặc có bất kỳ nền tảng lý thuyết nào khác cho các lớp loại (ví dụ dựa trên tính toán lambda đã gõ)?


1
Bạn có thể muốn rõ ràng hơn về chính xác những gì bạn muốn một mô hình cho. Nếu bạn muốn một cái gì đó có thể mô tả chặt chẽ giả định thế giới mở, hành vi của độ phân giải cá thể, sự tương tác của các phần mở rộng GHC khác nhau, & c., Thì nó phức tạp hơn một phiên bản lý tưởng hóa. Tương tự, lưu ý rằng đáy thường bị bỏ qua khi thảo luận về Hask.
CA McCann

4
Các lớp loại có thể được coi là chữ ký (theo nghĩa đại số phổ quát). Bộ sưu tập của tất cả các thực thể chia sẻ cùng một chữ ký (các thành phần của cùng loại lớp) là một loạt .
Dave Clarke

1
@DaveClarke: Tôi không rõ ràng ngay lập tức về cách mô tả các lớp loại trên các loại cao hơn theo cách đó, nhưng tôi không quen thuộc lắm với đại số phổ quát và có thể hiểu nhầm sự tương ứng mà bạn có trong tâm trí ...
CA McCann

1
@camccann: Tôi không chắc sự tương ứng sẽ đi bao xa. Nó chắc chắn có vẻ như một điểm khởi đầu tốt.
Dave Clarke

2
@camccann: Chỉ cần thay đổi danh mục cơ sở mà bạn đang xác định đại số của mình: các lớp loại cơ bản như num là chữ ký trên danh mục các loại haskell (hoặc các đối tượng của thể loại Hsk), các lớp loại trên các hàm tạo kiểu là đại số trên danh mục hàm. từ Hask đến Hask. Lưu ý rằng đại số phổ quát hoàn toàn bị thu hẹp bởi khái niệm đại số trong lý thuyết thể loại. Ngoài ra: Dave: bạn nên biến bình luận của bạn thành một câu trả lời.
cody

Câu trả lời:


18

Làm thế nào để các lớp loại phù hợp trong mô hình này?

Câu trả lời ngắn gọn là: họ không.

Bất cứ khi nào bạn giới thiệu các sự ép buộc, các lớp loại hoặc các cơ chế khác cho tính đa hình ad-hoc vào một ngôn ngữ, vấn đề thiết kế chính mà bạn gặp phải là sự gắn kết .

Về cơ bản, bạn cần đảm bảo rằng độ phân giải kiểu chữ là xác định, để một chương trình được gõ tốt có một cách hiểu duy nhất. Ví dụ: nếu bạn có thể đưa ra nhiều phiên bản cho cùng một loại trong cùng một phạm vi, bạn có khả năng có thể viết các chương trình mơ hồ như thế này:

class Blah a where
   blah : a -> String 

instance Blah T where
   blah _ = "Hello"

instance Blah T where
   blah _ = "Goodbye"

v :: T = ...

main :: IO ()
main = print (blah v)  -- does this print "Hello" or "Goodbye"?

Tùy thuộc vào sự lựa chọn của trình biên dịch, trình biên dịch blah vcó thể bằng "Hello"hoặc "Goodbye". Do đó, ý nghĩa của một chương trình sẽ không hoàn toàn được xác định bởi cú pháp của chương trình, mà có thể bị ảnh hưởng bởi các lựa chọn tùy ý mà trình biên dịch đưa ra.

Giải pháp của Haskell cho vấn đề này là yêu cầu mỗi loại có nhiều nhất một thể hiện cho mỗi kiểu chữ. Để đảm bảo điều này, nó chỉ cho phép khai báo cá thể ở cấp cao nhất và hơn nữa làm cho tất cả các khai báo có thể nhìn thấy trên toàn cầu. Theo cách đó, trình biên dịch luôn có thể báo hiệu lỗi nếu khai báo thể hiện mơ hồ được thực hiện.

Tuy nhiên, làm cho các tuyên bố có thể nhìn thấy trên toàn cầu phá vỡ tính cấu thành của ngữ nghĩa. Những gì bạn có thể làm để phục hồi là đưa ra một ngữ nghĩa chi tiết cho ngôn ngữ lập trình - nghĩa là bạn có thể chỉ ra cách dịch các chương trình Haskell sang một ngôn ngữ có tính kết hợp tốt hơn, có tính kết hợp tốt hơn.

Điều này thực sự mang đến cho bạn một cách để biên dịch các kiểu chữ, cũng thường được gọi là "dịch thuật bằng chứng" hoặc "chuyển đổi từ điển" trong vòng tròn Haskell và là một trong những giai đoạn đầu của hầu hết các trình biên dịch Haskell.

Máy đánh chữ cũng là một ví dụ tốt về cách thiết kế ngôn ngữ lập trình khác với lý thuyết loại thuần túy. Máy đánh chữ là một tính năng ngôn ngữ thực sự tuyệt vời, nhưng chúng khá sai theo quan điểm lý thuyết. (Đây là lý do tại sao Agda hoàn toàn không có máy đánh chữ và tại sao Coq biến chúng thành một phần của cơ sở hạ tầng suy luận heuristic.)


ứng cử viên á quân nào có ngữ nghĩa học biểu thị iyswim?
Ohad Kammar

1
Tôi không có ý tưởng, than ôi.
Neel Krishnaswami

Điều này có công thêm một câu hỏi?
Ohad Kammar

@NeelKrishnaswami: Bạn có biết mô-đun ML phù hợp với điều này như thế nào không? Và những gì về các mô-đun Agda (mà ai đó đã đề cập với tôi là "hạng nhất")?
Lii

1
@Lii: Các mô-đun ML và bản ghi Agda hoạt động tốt hơn nhiều , nhưng quá phức tạp để giải thích trong một nhận xét - hãy đặt câu hỏi về chúng và tôi (hoặc người khác) sẽ giải thích.
Neel Krishnaswami
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.