Trong GHC 7.8 trở về trước, Applicative
không phải là siêu lớp của Monad
. Nó thậm chí còn có thể cho một cá thể Monad
để không có cá thể Applicative
. Tuy nhiên, có một kỳ vọng rằng pure
và return
phải có cùng một hành vi đối với các loại là các phiên bản của cả hai.
Trong GHC 7.10, do Functor-Applicative-Monad Proposal, Applicative
bây giờ là một lớp cha của Monad
(class Applicative m => Monad m
) và nó bây giờ là một quy tắc rằng pure
và return
phải giống nhau cho tất cả Monad
trường. Thực tế, triển khai mặc định của return
hiện là pure
, như đã thấy trong the source on hackage.
pure
có thể được ưu tiên là return
vì nó không phải chịu ràng buộc Monad
, chỉ hạn chế Applicative
, do đó làm cho hàm tổng quát hơn. return
có thể được ưu tiên là pure
trong ký hiệu vì tiền lệ lịch sử, nhưng pure
có thể được sử dụng để chính xác cùng một hiệu ứng.
Nguồn
2015-09-25 18:36:35
Không có sự khác biệt, cả hai đều tồn tại vì lý do lịch sử ('Monad' không phải lúc nào cũng là một siêu lớp của' Applicative'). Có một đề xuất để đặt bí danh 'return' thành' pure'. – Lee
Để làm rõ, chúng chỉ giống nhau nếu bạn biết bạn đang xử lý 'Monad'. 'pure' là tổng quát hơn' return' ở chỗ nó trả về 'Applicative' để bạn không thể thay thế tất cả các instance' return' bằng 'pure' nhưng bạn có thể thay thế' pure' bằng 'return'. – Lee
@Lee, tôi nghĩ đó là cách khác xung quanh trong câu thứ hai của bạn. –