2015-03-18 15 views
24

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?

+0

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) –

Trả lời

46

Không có chức năng nào như vậy. join rõ ràng là thiếu ApplicativeMonad.

48

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

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.

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