【函数式】Monads模式初探——Monoids

Monads是什么

知乎里有关于什么是Monad的问题讨论,而在维基百科中也有关于Monad的释义。作为初次接触到Monads概念,难免会有些晕头转向,也难免会有些畏惧(因为Monads和数学中的范畴论有密切关系),但是Monads又是如此的重要,因为它在函数式编程中实在是应用太广泛了,并且在Scala的标准库中又常常遇到,使得我们不得不好好研究一番。

Monoids

Monoids是一种元素的集合,它需要满足结合律和幺元(Identity,也称为单位元,这种元和其他元素结合时,不会改变那么元素)这些约束条件。
比如:

  • 整数类型Int,其中0是Identity,其中的任何整数满足结合律
  • 列表类型List,任何两个列表可以通过:::连接起来,其中Nil或空列表[]是Identity
  • 字符串类型String,两个字符串可以拼接,其中空字符串或”“是Identity

Monoids在平常的编程之中无处不在,当用到一个列表,连接字符串,通过一个循环得到一个累加结果,都在使用到Monoids。

条件和定律

  1. 一个抽象类型A
  2. 一个二元结合性函数(binary associative function),对传入的两个A类参数进行操作后产生一个A类型结果。op操作必须是结合性的,即op(x, y) == op(y, x);op(a,op(b,c)) = op(op(a,b),c):这个定律是函数组合(function composition)不可缺的条件
  3. 一个恒等值(identity)。二元函数参数中如果有一个是恒等值时操作结果为另一个参数,即满足op(identity, x) == x

示例

Monoid可以用下面的代码描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值