2011-12-31 28 views
13
class Monad m where 
    return :: a -> m a 
    (>>=) :: m a -> (a -> m b) -> m b 
    (>>) :: m a -> m b -> m b 
    m >> n = m >>= \_ -> n 

    fail :: String -> m a 

Tôi chưa bao giờ thấy phương trình (hoặc khai báo hàm?) Trong typeclass trước đây. Tại sao có một phương trình trong typeclass?phương trình này với ký hiệu lambda "m >> n = m >> = _ -> n" trong khai báo của monad là gì?

Tôi biết _ là thuật ngữ để đối sánh mọi thứ. nhưng những gì m >> = \ _ -> n khớp?

+1

Tôi vừa nhận ra rằng ** \\ _ -> n ** ném thông số đầu tiên. – snow

Trả lời

17

Đó là triển khai mặc định cho phương pháp. Trừ khi khai báo cá thể của bạn có chứa việc triển khai rõ ràng (>>), đó là định nghĩa sẽ được sử dụng. Các phương thức mặc định được phổ biến rộng rãi nếu một số phương thức có thể được thực hiện bằng cách sử dụng một phương thức khác, nhưng có khả năng có thể có các triển khai hiệu quả hơn cho một số kiểu dữ liệu.

m >>= \_ -> n 

có nghĩa là 'kết quả' của m được đưa vào chức năng mà bỏ qua đối số của nó và trả về n dù. Nó cũng có thể được viết

m >>= const n 

Trong bối cảnh monads với các hiệu ứng, đó là 'làm m có những ảnh hưởng, nhưng bỏ qua các giá trị trả về, sau đó làm n'. Đó là những gì (>>) có nghĩa là để làm ở đó.

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