博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
我所理解的monad(1):半群(semigroup)与幺半群(monoid)
阅读量:6387 次
发布时间:2019-06-23

本文共 1314 字,大约阅读时间需要 4 分钟。

google到数学里定义的群(group): G为非空集合,如果在G上定义的二元运算 *,满足

(1)封闭性(Closure):对于任意a,b∈G,有a*b∈G(2)结合律(Associativity):对于任意a,b,c∈G,有(a*b)*c=a*(b*c)(3)幺元 (Identity):存在幺元e,使得对于任意a∈G,e*a=a*e=a(4)逆元:对于任意a∈G,存在逆元a^-1,使得a^-1*a=a*a^-1=e

则称(G,*)是群,简称G是群。

如果仅满足封闭性和结合律,则称G是一个半群(Semigroup);如果仅满足封闭性、结合律并且有幺元,则称G是一个含幺半群(Monoid)。

相比公式还是用代码表达更容易理解,下面表示一个半群(semigroup):

trait SemiGroup[T] {    def append(a: T, b: T): T}

特质SemiGroup,定义了一个二元操作的方法append,可以对半群内的任意2个元素结合,且返回值仍属于该半群。

我们看具体的实现,一个Int类型的半群实例:

object IntSemiGroup extends SemiGroup[Int] {    def append(a: Int, b: Int) = a + b}// 对2个元素结合val r = IntSemiGroup.append(1, 2)

现在在半群的基础上,再增加一个幺元(Identity,也翻译为单位元),吐槽一下,幺元这个中文不知道最早谁起的,Identity能表达的意义(同一、恒等)翻译到中文后完全消失了。

trait Monoid[T] extends SemiGroup[T] {    // 定义单位元    def zero: T}

上面定义了一个幺半群,继承自半群,增加了一个单位元方法,为了容易理解,我们用zero表示,半群里的任何元素a与zero结合,结果仍是a本身。

构造一个Int类型的幺半群实例:

object IntMonoid extends Monoid[Int] {    // 二元操作    def append(a: Int, b: Int) = a + b    // 单位元    def zero = 0}

构造一个String类型的幺半群实例:

object StringMonoid extends Monoid[String] {    def append(a: String, b: String) = a + b    def zero = ""}

再构造一个复杂点的 List[T] 的幺半群工厂方法:

def listMonoid[T] = {    new Monoid[List[T]] {         def zero = Nil        def append(a: List[T], b: List[T]) = a ++ b     }}

OK,现在我们已经了解了幺半群是什么样了,但它有什么用?

http://hongjiang.info/semigroup-and-monoid/

转载地址:http://rrbha.baihongyu.com/

你可能感兴趣的文章
[转]Creating Unit Tests for ASP.NET MVC Applications (C#)
查看>>
解决Fiddler不能监听Java HttpURLConnection请求的方法
查看>>
wmic 命令的一个汇总,功能很强大
查看>>
※编程随笔※=>☆编程基础☆=>※№ SVN工具自动属性 $Author$ $Date$ $Revision$ $URL$ $Header$替换...
查看>>
记一次修复被篡改的IE首页
查看>>
北京瑜舍酒店成京城“精品”酒店代表(图)_新浪尚品_新浪网
查看>>
解决Xcode "The selected destination does not support the architecture " 错误错误
查看>>
《PHP对象、模式与实践》之高级特性
查看>>
小智慧32
查看>>
Jquery通过Ajax方式来提交Form表单
查看>>
项目安排(离散化+DP)
查看>>
提高你的Java代码质量吧:让我们疑惑的字符串拼接方式的选择
查看>>
〖Linux〗Bash快捷键使用
查看>>
uva 10054 The Necklace(欧拉回路)
查看>>
jquery获取元素的值,获取当前对象的父对象等等
查看>>
BZOJ2831(小强的金字塔系列问题--区域整点数求法)
查看>>
[译]ES6新特性:八进制和二进制整数字面量
查看>>
mysql出现“Incorrect key file for table”解决办法
查看>>
mysql 查询
查看>>
WPF学习总结1:INotifyPropertyChanged接口的作用
查看>>