Các câu trả lời ở đây thực hiện một công việc tuyệt vời trong việc xác định cả đơn âm và đơn âm, tuy nhiên, dường như chúng vẫn không trả lời được câu hỏi:
Và trên một lưu ý ít quan trọng hơn, điều này có đúng không và nếu vậy bạn có thể đưa ra lời giải thích (hy vọng một điều có thể được hiểu bởi một người không có nhiều kinh nghiệm về Haskell)?
Mấu chốt của vấn đề còn thiếu ở đây, là khái niệm khác nhau về "monoid", cái gọi là phân loại chính xác hơn - một trong những đơn chất trong một thể loại đơn. Đáng buồn thay, cuốn sách của Mac Lane khiến nó rất khó hiểu :
Tất cả đã nói, một đơn nguyên Xchỉ là một monoid trong danh mục endofunctor của X, với sản phẩm được ×thay thế bằng thành phần của endofunctor và đơn vị được thiết lập bởi endofunctor nhận dạng.
Sự nhầm lẫn chính
Tại sao điều này khó hiểu? Bởi vì nó không định nghĩa "monoid trong danh mục endofunctor" là gì X. Thay vào đó, câu này đề nghị lấy một monoid bên trong tập hợp tất cả các endofunctor cùng với thành phần functor là hoạt động nhị phân và functor nhận dạng như một đơn vị đơn hình. Nó hoạt động hoàn toàn tốt và biến thành một tập hợp con bất kỳ tập hợp con endofunctor có chứa functor danh tính và được đóng dưới thành phần functor.
Tuy nhiên, đây không phải là giải thích chính xác, mà cuốn sách không làm rõ ở giai đoạn đó. Một Monad flà một endofunctor cố định , không phải là một tập hợp con endofunctor được đóng theo thành phần. Một cấu trúc phổ biến là sử dụng fđể tạo ra một monoid bằng cách lấy tập hợp các kthành phần f^k = f(f(...))gồm nhiều phần của fchính nó, bao gồm cả phần k=0tương ứng với danh tính f^0 = id. Và bây giờ, tập hợp Stất cả các quyền hạn k>=0này thực sự là một "đơn chất" với sản phẩm × được thay thế bằng thành phần của endofunctor và đơn vị được thiết lập bởi endofunctor danh tính ".
Chưa hết:
- Monoid này
Scó thể được định nghĩa cho bất kỳ functor fhoặc thậm chí theo nghĩa đen cho bất kỳ bản đồ tự X. Nó là monoid được tạo ra bởi f.
- Cấu trúc đơn hình
Sđược đưa ra bởi thành phần functor và functor danh tính không liên quan gì đến việc có fhay không là một đơn nguyên.
Và để làm cho mọi thứ trở nên khó hiểu hơn, định nghĩa của "monoid trong thể loại đơn" xuất hiện sau trong cuốn sách như bạn có thể thấy từ mục lục . Tuy nhiên, hiểu được khái niệm này là rất quan trọng để hiểu mối liên hệ với các đơn nguyên.
(Nghiêm) các thể loại đơn
Chuyển đến Chương VII trên Monoids (xuất hiện muộn hơn Chương VI trên Monads), chúng tôi thấy định nghĩa của loại được gọi là loại đơn hình nghiêm ngặt là ba (B, *, e), trong đó Bmột loại, *: B x B-> Bmột bifunctor (functor đối với từng thành phần với thành phần khác được cố định ) và elà một đối tượng đơn vị trong B, đáp ứng luật kết hợp và luật đơn vị:
(a * b) * c = a * (b * c)
a * e = e * a = a
cho bất kỳ đối tượng a,b,c của B, và bản sắc tương tự cho bất kỳ morphisms a,b,cvới ethay thế bằng id_e, các cấu xạ sắc của e. Bây giờ chúng ta nên quan sát rằng trong trường hợp quan tâm của chúng ta, đâu Blà danh mục của endofunctor Xvới các biến đổi tự nhiên là hình thái, *thành phần functor và efunctor, tất cả các luật này đều được thỏa mãn, như có thể được xác minh trực tiếp.
Điều xuất hiện sau trong cuốn sách là định nghĩa về phạm trù đơn hình "thoải mái" , trong đó các luật chỉ giữ modulo một số biến đổi tự nhiên cố định thỏa mãn cái gọi là quan hệ kết hợp , tuy nhiên không quan trọng đối với các trường hợp của chúng ta về các thể loại endofunctor.
Đơn chất trong các loại đơn
Cuối cùng, trong phần 3 "Monoids" của Chương VII, định nghĩa thực tế được đưa ra:
Một monoid ctrong một thể loại đơn(B, *, e) là một đối tượng Bcó hai mũi tên (hình thái)
mu: c * c -> c
nu: e -> c
làm 3 sơ đồ giao hoán. Hãy nhớ lại rằng trong trường hợp của chúng tôi, đây là những hình thái trong thể loại endofunctor, là những biến đổi tự nhiên tương ứng với chính xác joinvàreturn cho một đơn nguyên. Sự kết nối càng trở nên rõ ràng hơn khi chúng ta làm cho bố cục *rõ ràng hơn, thay thế c * cbằng c^2, cđơn vị của chúng ta ở đâu .
Cuối cùng, lưu ý rằng 3 sơ đồ giao hoán (theo định nghĩa của một đơn hình trong loại đơn hình) được viết cho các loại đơn hình chung (không nghiêm ngặt), trong khi trong trường hợp của chúng tôi, tất cả các biến đổi tự nhiên phát sinh như một phần của thể loại đơn hình thực sự là danh tính. Điều đó sẽ làm cho các sơ đồ giống hệt như các sơ đồ trong định nghĩa của một đơn nguyên, làm cho sự tương ứng hoàn thành.
Phần kết luận
Tóm lại, bất kỳ đơn nguyên nào theo định nghĩa là endofunctor, do đó, một đối tượng trong danh mục endofunctor, trong đó đơn vị joinvà returntoán tử thỏa mãn định nghĩa của một monoid trong thể loại đơn (cụ thể) cụ thể đó . Ngược lại, bất kỳ monoid nào trong thể loại endofunctor theo định nghĩa là một bộ ba (c, mu, nu)bao gồm một đối tượng và hai mũi tên, ví dụ như các phép biến đổi tự nhiên trong trường hợp của chúng ta, đáp ứng các định luật giống như một đơn nguyên.
Cuối cùng, lưu ý sự khác biệt chính giữa các đơn sắc (cổ điển) và các đơn sắc tổng quát hơn trong các thể loại đơn. Hai mũi tên muvà nutrên không nữa một hoạt động nhị phân và một đơn vị trong một bộ. Thay vào đó, bạn có một endofunctor cố định c. Thành phần functor* và functor danh tính không cung cấp cấu trúc hoàn chỉnh cần thiết cho đơn nguyên, mặc dù nhận xét khó hiểu trong cuốn sách.
Một cách tiếp cận khác là so sánh với monoid tiêu chuẩn Ccủa tất cả các bản đồ tự của một tập hợp A, trong đó hoạt động nhị phân là thành phần, có thể được nhìn thấy để ánh xạ sản phẩm cartesian tiêu chuẩn C x Cvào C. Chuyển đến monoid được phân loại, chúng tôi sẽ thay thế sản phẩm cartesian xbằng thành phần functor *và hoạt động nhị phân được thay thế bằng chuyển đổi tự nhiên mutừ
c * csang c, đó là một tập hợp các jointoán tử
join: c(c(T))->c(T)
cho mọi đối tượng T(gõ trong lập trình). Và các yếu tố nhận dạng trong các đơn sắc cổ điển, có thể được xác định bằng hình ảnh của các bản đồ từ tập hợp một điểm cố định, được thay thế bằng bộ sưu tập của các returntoán tử
return: T->c(T)
Nhưng bây giờ không còn sản phẩm cartesian, vì vậy không có cặp phần tử và do đó không có hoạt động nhị phân.