Tôi đang tìm kiếm các chức năng sau:'tham gia' cho các ứng viên?
Applicative f => f (f a) -> f a
Hoogle chỉ cho tôi join
:
>:t join
join :: Monad m => m (m a) -> m a
Có một chức năng phù hợp với chữ ký của tôi mong muốn?
Tôi đang tìm kiếm các chức năng sau:'tham gia' cho các ứng viên?
Applicative f => f (f a) -> f a
Hoogle chỉ cho tôi join
:
>:t join
join :: Monad m => m (m a) -> m a
Có một chức năng phù hợp với chữ ký của tôi mong muốn?
Không có chức năng nào như vậy. join
rõ ràng là thiếu Applicative
và Monad
.
Để mở rộng một chút trên Carl's answer, Nếu có một điều như join
, nhưng đối với applicatives:
class Applicative f => ApplicativeWithJoin f where
join' :: f (f a) -> f a
Sau đó, bạn sẽ tự động có một đơn nguyên:
instance ApplicativeWithJoin m => Monad m where
return = pure
x >>= f = join' (f <$> x)
Mở rộng trên SingleNegationElimination của answer:
Applicative
's <*>
cho phép bạn kết hợp các hiệu ứng với nhau và các giá trị của chúng bên trong, hoặc thao tác một giá trị bên trong bằng cách sử dụng <$>
, nhưng bạn không thể tạo hiệu ứng phụ thuộc vào giá trị của phép tính trước đó. Mặt khác,Monad
s cho phép hiệu ứng được xác định bởi kết quả của phép tính trước đó, như được chứng minh bởi >>=
.Với bất kỳ Applicative
lần đầu tiên bạn có thể sử dụng <$>
để chuyển đổi một giá trị kiểu a
bên f a
vào một số f b
, vì vậy bạn sẽ nhận được f (f b)
. Nhưng không có join
, bên trong f b
chỉ là một giá trị khác, không có cách nào để bạn có thể kết hợp nó với giá trị bên ngoài thực sự được thực thi. Thêm join
làm cho nó có thể, cho phép để xác định toàn bộ sức mạnh của Monad
.
Bản sao có thể có của [Lợi ích nào Monad cung cấp cho chúng tôi qua đơn đăng ký?] (Http://stackoverflow.com/questions/17409260/what-advantage-does-monad-give-us-over-an-applicative) –