前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Monad 定律

Monad 定律

作者头像
Sheepy
发布2018-09-10 12:26:03
4760
发布2018-09-10 12:26:03
举报
文章被收录于专栏:我杨某人的青春满是悔恨

monad 是支持>>=操作的 applicative 函子,>>=读作绑定,它的类型是:

代码语言:javascript
复制
(>>=) :: (Monad m) => m a -> (a -> m b) -> m b

即取一个 monad 和一个函数,返回一个新的 monad。monad 有专属的类型类——Monad,其定义如下:

代码语言:javascript
复制
class Applicative m => Monad (m :: * -> *) where
  (>>=) :: m a -> (a -> m b) -> m b
  (>>) :: m a -> m b -> m b
  return :: a -> m a
  fail :: String -> m a

return和 applicative 的pure一样,都是取一个值,把它放在能产生这个值的最小默认上下文中。>>=前面说过了,>>有一个默认实现,就是把一个 monad 直接换成另一个 monad 返回,fail不会被主动调用,在一些特定语法结构中,会被 Haskell 用于模式匹配。

一个类型要成为 monad 不仅要满足 Monad 类型类的条件,还要满足 monad 定律(虽然编译器并不会帮你检查):

  • 左单位元:return x >>= f 和 f x 等价
  • 右单位元:m >>= return 和 m 等价
  • 结合律:(m >>= f) >>= g 和 m >>= (\x -> f x >>= g) 等价
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.02.27 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档