Thể loại lý thuyết (không) cho lập trình?


21

Sau khi học Haskell và các ngôn ngữ FP không thuần túy khác, tôi quyết định đọc về lý thuyết Danh mục. Sau khi hiểu rõ về lý thuyết Danh mục, tôi bắt đầu suy nghĩ về cách sử dụng các khái niệm của lý thuyết thể loại để suy nghĩ về việc thiết kế các chương trình nhưng cho dù tôi có cố gắng thế nào thì dường như đây không phải là hướng đi.

Sau khi dành nhiều nỗ lực không thành công để liên kết lý thuyết thể loại với thiết kế chương trình, tôi đã đi đến kết luận rằng:

  • Lý thuyết danh mục rất hữu ích khi thiết kế một ngôn ngữ lập trình .
  • Lý thuyết danh mục không phải là thứ bạn sử dụng khi thiết kế chương trình (ngay cả khi sử dụng ngôn ngữ được thiết kế dựa trên nguyên tắc danh mục). Ví dụ: Khi lập trình trong Haskell, bạn sẽ sử dụng các kiểu, kiểu hàm tạo, hàm, hàm bậc cao hơn v.v để thiết kế chương trình của bạn, không phải là khái niệm lý thuyết thể loại.

Tóm lại, chúng tôi có hệ thống lớp bên dưới (thứ tự từ thấp đến cao):

Lý thuyết danh mục -> Ngôn ngữ lập trình -> Chương trình

Tại một lớp cụ thể, bạn sử dụng các khái niệm của lớp bên dưới ngay lập tức .

Sự hiểu biết này có đúng không? Nếu không và bạn tin rằng trong việc thiết kế các chương trình, chúng ta có thể trực tiếp sử dụng các khái niệm lý thuyết thể loại, vui lòng tham khảo một số bài viết hoặc bài đăng trên blog nơi nó đang được trình bày.

LƯU Ý: Bằng cách thiết kế các chương trình, tôi có nghĩa là thiết kế các chương trình dựa trên các khái niệm khác nhau, như đồng thời, song song, phản ứng, truyền thông điệp, v.v.


1
Bạn có coi các đơn nguyên là một phần của ngôn ngữ lập trình hoặc chương trình không? Mũi tên?
Dave Clarke

2
Điều này gây ấn tượng với tôi như một câu hỏi triết học, ít nhất là một phần. Tôi không chắc có một câu trả lời đúng. Một người giỏi về lý thuyết thể loại sẽ áp dụng trực giác có được từ nó trong khi lập trình, một người khác sẽ thiên về những cách nghĩ khác nhau.
Raphael

2
Hầu hết các chương trình được viết sử dụng ngôn ngữ lập trình không lấy cảm hứng từ lý thuyết thể loại. Theo như tôi có thể nói, lập trình viên trung bình không biết về lý thuyết thể loại và vì vậy hầu hết các chương trình (bao gồm cả hệ điều hành và trình duyệt của bạn) không lấy cảm hứng từ toán học cao hơn.
Yuval Filmus

1
@YuvalFilmus: Câu hỏi của tôi nhắm vào các ngôn ngữ lập trình chức năng
Ankur

1
xem thêm câu hỏi này cho một số ứng dụng CS của monoids
vzn

Câu trả lời:


13

Chà, điều đó tất nhiên phụ thuộc vào loại chương trình bạn đang cố gắng thiết kế.

Nếu bạn đang thiết kế một chương trình kế toán cho cửa hàng sô cô la của dì, tôi rất nghi ngờ lý thuyết danh mục sẽ được sử dụng nhiều.

Nhưng tất nhiên có những tình huống trong đó lý thuyết thể loại rất hữu ích trong việc thiết kế các chương trình (theo đó tôi cũng có nghĩa là cấu trúc dữ liệu, thư viện, v.v.). Những tình huống như vậy xảy ra chủ yếu khi các chương trình liên quan có tính chất toán học.

Nếu bạn muốn viết các chương trình tính toán với các số thực chính xác và các cấu trúc khác xảy ra trong phân tích toán học, câu hỏi đầu tiên bạn cần trả lời là ý nghĩa của việc thực hiện chính xác một đối tượng toán học phức tạp (như hàm phân biệt, đa tạp, v.v. ). Ở đây nó giúp rất nhiều để biết một số lý thuyết và logic thể loại, bởi vì chúng cung cấp cho bạn một cách dịch hệ thống các định nghĩa của các cấu trúc toán học sang các đặc tả và triển khai các cấu trúc dữ liệu tương ứng. Từ thông dụng bạn nên tìm là lý thuyết khả thi . Nhưng đây chỉ là một ví dụ.

Cách tốt nhất để xem lý thuyết danh mục có ích như thế nào là xem xét các chương trình được viết bởi những người biết nhiều lý thuyết thể loại (và toán học nói chung). Một ví dụ rõ ràng về điều này là Martín Escardó và các chức năng không thể của anh ta, ví dụ:

M. Escardó và P. Oliva: Trò chơi tuần tự nào, Định lý Tychonoff và Chuyển dịch phủ định kép có trong Lập trình chức năng cấu trúc toán học phổ biến 2010, Báo chí ACM. (với các tệp Haskell và Agda đồng hành )

Bạn có thể phàn nàn rằng đây không chỉ là lý thuyết thể loại mà còn là logic và cấu trúc liên kết. Những khiếu nại như vậy sẽ bị sai lầm nghiêm trọng. Lý thuyết thể loại tốt nhất luôn luôn được trộn lẫn với những thứ khác.

Cuối cùng, tôi sẽ khuyên không nên đưa ra kết luận lớn về bản chất của sự việc dựa trên một chút về việc tự đọc.


Đó chính xác là quan điểm của tôi. Nếu tôi đang thiết kế phần mềm kế toán, hệ thống loại sẽ là ngôn ngữ của tôi để thiết kế. Nếu tôi đang thiết kế một phần mềm toán học thì tôi sẽ sử dụng hệ thống loại để biểu diễn các khái niệm lý thuyết thể loại. Về cơ bản chỉ ra rằng lý thuyết loại HOẶC hệ thống loại là trừu tượng tổng quát hơn lý thuyết thể loại.
Ankur

1
Đó là một tuyên bố nực cười. Tôi nghĩ có lẽ bạn nên tìm hiểu thêm một chút trước khi bạn đưa ra những tuyên bố sâu rộng như thế. Có lẽ bạn có thể bắt đầu với survivalentialtype.wordpress.com/2011/03/27/the-holy-trinity
Andrej Bauer

Tôi không phải là nhà nghiên cứu, anh chàng Phd, nhà khoa học, nhà toán học hay nhà lý luận phạm trù, vì vậy đừng buồn về những phát biểu của tôi, chúng sẽ không được công bố trên một số tạp chí khoa học hoặc nghiên cứu. Tôi chỉ là một lập trình viên đang cố gắng hiểu mặt khác của đồng tiền. Nhân tiện, cảm ơn vì liên kết.
Ankur

1
Tôi nhận ra điều này, đó chính xác là lý do tại sao tôi đề nghị rằng bạn nên cẩn thận khi đưa ra kết luận như bạn: đơn giản là bạn không có thông tin cần thiết để đưa ra kết luận như vậy. Và đây cũng là lý do tại sao tôi giới thiệu bạn đến một bài viết trên blog của Bob Harpher chứ không phải là, một số cuốn sách kỹ thuật về mối quan hệ giữa lý thuyết loại và lý thuyết thể loại. Tôi đang cố gắng giúp đỡ, nhưng tôi mong đợi được trả lại thêm một chút từ bạn khi đưa ra kết luận lớn về bản chất của cả một nhánh toán học.
Andrej Bauer

Ví dụ, bạn đã nói rằng "lý thuyết loại là một sự trừu tượng tổng quát hơn so với lý thuyết thể loại". Đây là một ví dụ về một tuyên bố mà bạn nên biết không nên đưa ra dựa trên ít kiến ​​thức. Tôi làm việc chuyên nghiệp trong lĩnh vực này và thậm chí tôi sẽ rất cẩn thận để đưa ra kết luận như vậy, hoặc ngược lại.
Andrej Bauer

6

Mọi người thường sử dụng CT để mô tả các loại dữ liệu.

  1. Kiểu dữ liệu được xác định bởi một thể loại cụ thể có đối tượng là các chuỗi hữu hạn của các loại (ngôn ngữ đặc tả) và mũi tên của chúng là các hình chiếu hoặc các thành phần khác của các hoạt động của kiểu dữ liệu. Ví dụ, đối tượng là miền và là tên miền của hoạt động đẩy của ngăn xếp. Điều này cung cấp cho bạn cú pháp, nhưng bạn vẫn không có khái niệm về ngữ nghĩa.
  2. Một đại số, có thể nói, một thể hiện của loại, là một hàm tử từ lý thuyết đến Đảm bảo, loại tập hợp (nhỏ). (Chúng tôi sử dụng "nhỏ" để tránh nghịch lý của Russell, nhưng điều đó không quan trọng.)
  3. Nó chỉ ra rằng các thuộc tính đóng của các loại tương ứng với các họ của các lý thuyết logic. Ví dụ: nếu danh mục lý thuyết được đóng dưới các sản phẩm, loại dữ liệu có thể được axiomatized bởi các phương trình. Nếu phạm trù lý thuyết được đóng bằng cách lấy pullback, thì kiểu dữ liệu có thể được axiomatized bởi các câu Horn.

Tôi không hoàn toàn chắc chắn có ai chú ý đến điều này nữa. Tôi nghĩ rằng điều này , và các liên kết ở đó, sẽ giải thích chi tiết hơn.

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.