2012-04-26 15 views

Trả lời

50

Một hàm functor có thể đi từ một danh mục này sang một danh mục khác, một trình kết thúc là một hàm cho danh mục bắt đầu và mục tiêu nào giống nhau.

Tương tự như với các hình thái cuối cùng so với hình thái.

Bây giờ, tại sao các đơn vị phải là người kết thúc?

Có câu nói nổi tiếng rằng "Monads chỉ là monoids trong danh mục endofunctors". May mắn thay, có người khác đã giải thích rằng khá tốt in this answer.

Điểm mấu chốt tại sao một đơn vị phải là người kết thúc, là join, như được gọi trong Haskell, hoặc µ, vì nó thường được gọi trong lý thuyết thể loại, là một phần của định nghĩa¹ của một đơn nguyên. Bây giờ

Prelude Control.Monad> :t join 
join :: Monad m => m (m a) -> m a 

vì vậy kết quả của việc áp dụng functor m đến một đối tượng (trong Hask, các loại của các loại Haskell như các đối tượng và chức năng như morphisms, một loại) phải là một đối tượng mà m một lần nữa có thể được áp dụng cho. Điều đó có nghĩa là nó phải thuộc về thể loại đó là tên miền của functor m.

Một functor chỉ có thể được sáng tác với chính nó nếu tên miền và tên miền của nó giống nhau [đúng, nếu tên miền của nó là một danh mục con của miền của nó], nói cách khác, nếu nó là một endofunctor. Kể từ khi composability với chính nó là một phần của định nghĩa của một đơn nguyên, monads là một endofunctors fortiori.

¹ Một định nghĩa, một cách khác có thể xác định một đơn nguyên bằng cách sử dụng (>>=) hoặc bind và có join làm thuộc tính phái sinh.

+4

Có bất kỳ functors trong Haskell không phải là endofunctors? (Không phải tất cả các bản đồ Hask để Hask?) – huon

+4

Phải, tất cả các fasktors Haskell là endo. –

+3

Những người không có giới hạn có sẵn trong các gói như http://hackage.haskell.org/packages/archive/categories/1.0/doc/html/Control-Categorical-Functor.html – sdcvvc

Các vấn đề liên quan