Thực tế là (>>=)
có thể được triển khai bằng cách sử dụng fmap
và join
trong khi join
có thể được triển khai bằng cách sử dụng >>=
. Có lý do nào chúng tôi không xác định lớp học Monad
với số join
được bao gồm và sử dụng các định nghĩa mặc định sau không?Tại sao không phải là `tham gia` một phần của lớp` Monad`
join x = x >>= id
x >>= f = join $ f <$> x
này sẽ cho phép một định nghĩa tối thiểu để bao gồm một trong hai chỉ (>>=)
hoặc join
, thay vì buộc (>>=)
. Có thể là một chút hữu ích xem xét lý thuyết thể loại có xu hướng ưu tiên join
.
Đối số bình thường chống lại các lớp sửa đổi là chúng tôi phá vỡ tính tương thích ngược. Tuy nhiên, trong trường hợp này, điều đó sẽ không xảy ra - chúng tôi chỉ thêm khả năng xác định Monad
sử dụng join
.
Như bạn nói, '(>> =) = tham gia. fmap', nhưng trước khi GHC 7.10 'Monad' là * không * tự động là một functor. Theo nghĩa đó, chúng ta định nghĩa cả 'join' và' fmap' trong 'bind'. Đôi khi cũng dễ thực hiện hơn '>> =' hơn là tham gia. Hãy thử làm điều đó cho, ví dụ, trình phân tích cú pháp/tiểu bang. – AJFarmar
@AJFarmar Tôi không nghĩ rằng '(>> =) = tham gia. fmap' hoạt động. Các đối số được lật và có một số vấn đề khác. Nhưng điểm tốt! – Alec
Ah, bạn nói đúng, nó thực sự là '(tham gia.). lật fmap', nhưng ý tưởng đã ở đó, như bạn nói. – AJFarmar