Haskell - Đơn nguyên

Monadskhông gì khác ngoài một loại Functor Ứng dụng với một số tính năng bổ sung. Nó là một lớp Loại điều chỉnh ba quy tắc cơ bản được gọi làmonadic rules.

Tất cả ba quy tắc này đều có thể áp dụng nghiêm ngặt đối với một tuyên bố Monad như sau:

class Monad m where  
   return :: a -> m a 
   (>>=) :: m a -> (a -> m b) -> m b 
   (>>) :: m a -> m b -> m b 
   x >> y = x >>= \_ -> y 
   fail :: String -> m a  
   fail msg = error msg

Ba luật cơ bản có thể áp dụng cho một tuyên bố Monad là:

  • Left Identity Law - Sự returnhàm không thay đổi giá trị và nó sẽ không thay đổi bất cứ điều gì trong Đơn nguyên. Nó có thể được biểu thị là "return> => mf = mf".

  • Right Identity Law - Sự returnhàm không thay đổi giá trị và nó sẽ không thay đổi bất cứ điều gì trong Đơn nguyên. Nó có thể được biểu thị là "mf> => return = mf".

  • Associativity- Theo luật này, cả Functors và Monad instance đều phải hoạt động theo cùng một cách. Nó có thể được biểu thị bằng toán học là "(f> ==> g)> => h = f> => (g> = h)".

Hai luật đầu tiên lặp lại cùng một điểm, tức là, return nên có hành vi nhận dạng ở cả hai phía của bind nhà điều hành.

Chúng ta đã sử dụng rất nhiều Đơn nguyên trong các ví dụ trước đây của mình mà không nhận ra rằng chúng là Đơn nguyên. Hãy xem xét ví dụ sau, nơi chúng tôi đang sử dụng Đơn nguyên danh sách để tạo một danh sách cụ thể.

main = do
   print([1..10] >>= (\x -> if odd x then [x*2] else []))

Mã này sẽ tạo ra kết quả sau:

[2,6,10,14,18]