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 X
chỉ 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 f
là 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 k
thành phần f^k = f(f(...))
gồm nhiều phần của f
chính nó, bao gồm cả phần k=0
tương ứng với danh tính f^0 = id
. Và bây giờ, tập hợp S
tất cả các quyền hạn k>=0
nà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
S
có thể được định nghĩa cho bất kỳ functor f
hoặ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ó f
hay 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 đó B
một loại, *: B x B-> B
một bifunctor (functor đối với từng thành phần với thành phần khác được cố định ) và e
là 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,c
với e
thay 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 B
là danh mục của endofunctor X
với các biến đổi tự nhiên là hình thái, *
thành phần functor và e
functor, 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 c
trong một thể loại đơn(B, *, e)
là một đối tượng B
có 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 join
và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 * c
bằ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ị join
và return
toá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 mu
và nu
trê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 C
củ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 C
vào C
. Chuyển đến monoid được phân loại, chúng tôi sẽ thay thế sản phẩm cartesian x
bằng thành phần functor *
và hoạt động nhị phân được thay thế bằng chuyển đổi tự nhiên mu
từ
c * c
sang c
, đó là một tập hợp các join
toá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 return
toá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.