Ai đó có thể giải thích một cách đơn giản sự khác biệt giữa hai? Tôi không hoàn toàn hiểu được phần mà các monads là những người kết thúc so với chỉ là các functors.Sự khác biệt giữa functors và endofunctors
Trả lời
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.
- 1. Sự khác biệt giữa monads miễn phí và fixpoints của functors?
- 2. Sự khác biệt giữa $ (...) và `...`
- 3. Sự khác biệt giữa. và #
- 4. Sự khác biệt giữa $ * và $ @
- 5. Sự khác biệt giữa ". +" Và ". +?"
- 6. Sự khác biệt giữa "**/* /" và "** /"?
- 7. Sự khác biệt giữa $ # và $ {# @}
- 8. Sự khác biệt giữa = và: =
- 9. Sự khác biệt giữa sự khác biệt biểu tượng và sự khác biệt tự động?
- 10. Sự khác biệt về sự khác biệt giữa Matplotlib giữa Agg và Cairo
- 11. Sự khác biệt giữa sự khác biệt giữa nhiệm vụ jar và lắp ráp
- 12. Sự khác biệt giữa Html.RenderAction và Html.Action
- 13. Sự khác biệt giữa cookie và phiên?
- 14. Sự khác biệt giữa '.' và "." trong java
- 15. Sự khác biệt giữa SimpleDB và S3
- 16. C++ - Sự khác biệt giữa (*). và ->?
- 17. Sự khác biệt giữa offsetHeight và clientHeight
- 18. Sự khác biệt giữa RDLC và SSRS
- 19. Sự khác biệt giữa "\ n" và Environment.NewLine
- 20. Sự khác biệt giữa qt và PyQt4
- 21. Sự khác biệt giữa AForge và OpenCV
- 22. Sự khác biệt giữa toFixed() và toPrecision()?
- 23. sự khác biệt giữa cacao và cocoatouch
- 24. Sự khác biệt giữa smtpClient.send() và smtpClient.SendAsync()?
- 25. Sự khác biệt giữa window.location.host và window.location.hostname
- 26. Sự khác biệt giữa DTLS và TLS
- 27. Sự khác biệt giữa Mealy và Moore
- 28. sự khác biệt giữa createRfcommSocketToServiceRecord và createRfcommSocket
- 29. Sự khác biệt giữa Arrays.sort() và Arrays.parallelSort()
- 30. sự khác biệt giữa orm và pdo
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
Phải, tất cả các fasktors Haskell là endo. –
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