Monad 定律

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

(>>=) :: (Monad m) => m a -> (a -> m b) -> m b

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

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) 等价

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 狼人杀入坑指南

    之前在年终总结里说 2017 年可能要退出搜车狼人杀 club 了,想想就这么净身出户还是有些遗憾,不如就把这两个月的游戏心得总结一下。当然我自己也是个业余选...

    Sheepy
  • Ruby 的魔法世界——元编程(一)

    能写代码的代码……是指代码生成器么?Java注解?C++模板?这些在广义上也属于元编程。不过这些过程发生在编译期(compiler time),称为静态元编程;...

    Sheepy
  • 程序设计思维

    《SICP》的全名是《Structure and Interpretation of Computer Programs》,中文译名《计算机程序的构造与解释》。...

    Sheepy
  • 浅谈UML的概念和模型之UML九种图

    http://blog.csdn.net/jiuqiyuliang/article/details/8552956

    bear_fish
  • 聊聊rocketmq的adjustThreadPoolNumsThreshold

    本文主要研究一下rocketmq的adjustThreadPoolNumsThreshold

    codecraft
  • 聊聊rocketmq的adjustThreadPoolNumsThreshold

    本文主要研究一下rocketmq的adjustThreadPoolNumsThreshold

    codecraft
  • 深入理解RocketMq普通消息和顺序消息使用,原理,优化

    最近一直再做一些系统上的压测,并对一些问题做了优化,从这些里面收获了一些很多好的优化经验,后续的文章都会以这方面为主。

    用户5397975
  • 未来智能+峰会(eSmart)深度分享第二弹

    VRPinea
  • PWA 系列(一)——Cache API

    PWA(Progressive web apps,渐进式 Web 应用)运用现代的 Web API 以及传统的渐进式增强策略来创建跨平台 Web 应用程序。

    JS菌
  • python协程--asyncio模块

    在高并发的场景下,python提供了一个多线程的模块threading,但似乎这个模块并不近人如意,原因在于cpython本身的全局解析锁(GIL)问题,在一段...

    py3study

扫码关注云+社区

领取腾讯云代金券