2015-09-25 19 views
16

Sự khác nhau giữa returnpure từ Control.Applicative là gì? Có vẻ như tôi có thể sử dụng pure ngay cả khi kết thúc khối do?Sự khác biệt giữa 'trả lại' và 'thuần túy'

Vì vậy, có bất kỳ tình huống nào nên được ưu tiên hơn bên kia (bên cạnh đó mọi người mong đợi một return ở cuối khối do)?

+6

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

+3

Để 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

+8

@Lee, tôi nghĩ đó là cách khác xung quanh trong câu thứ hai của bạn. –

Trả lời

26

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 purereturn 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 purereturn 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.

12

Kiểu chữ áp dụng được thêm sau Monad và lịch sử lớp Monad chưa phải là lớp con của Applicative. Điều này đã được thay đổi khá gần đây trong Applicative-Monad-Proposal và điều này có nghĩa là return a phải tương đương với pure a cho mỗi phiên bản Monad.

proposal để di chuyển return ra khỏi lớp Monad và đặt làm bí danh cho pure.

Do đó, khi giao dịch với Monad bạn luôn có thể sử dụng pure thay vì return. Tuy nhiên, bạn không thể đi theo cách khác vì từ pure có loại tổng quát hơn return vì nó chỉ trả lại Applicative. Ví dụ như sau

wontCheck :: Applicative f => f Int 
wontCheck = return 4 

sẽ không gõ kiểm tra kể từ return đòi hỏi f là một Monad.

+0

Mặc dù câu trả lời khác được chấp nhận và trước đó, tôi thực sự thích ví dụ của bạn –

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