博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
什么是Monad?
阅读量:6889 次
发布时间:2019-06-27

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

为了理解什么是Monad,最好需要了解。这两篇互为姐妹篇,因为Monad的定义是:A monad is just a monoid in the category of endofunctors, what's the problem?

  what's the problem?其实问题大了去了,这个定义中首先我们知道monad是一个特殊的monoid,特殊在哪里?是在endofunctor这个范畴里,正如书桌比桌子特殊,特殊在书桌用在看书读书这个范围里。所以,我们需要首先了解什么是endofunctor,而endofunctor是end of functor的组合,还得首先了解什么是functor函子。

 

自函子endofunctor

  一个functor是一个多态数据类型,支持用函数对数据内容的操作,这非常类似面向对象概念中的对象,一个对象也是由数据和方法组成,方法是操作数据的函数。所以,当我们认为世界上每个都是对象时,也可以认为每个都是functor。

  一个functor是将一个范畴(广群)转换到另外一个范畴(广群),而endofunctor则是转换的源范畴和目标范畴是同一个,endofunctor是functor的特殊。

  我们知道:一个范畴是由三个部分组成: 元素对象、态射(又称为箭头)以及二元运算。如果这个范畴又满足结合律,那么它是一个半群,如果又满足幺元,那么是幺半群,也就是Monoid。

  因此,functor实际是将一个Monoid中的元素对象映射到另外一个Monoid的元素对象,态射也是这么映射。而自函子endofunctor映射的这两个Monoid是同一个。 

  在Haskell中,一个endofunctor被称为"the Hask category,",是Hask范畴。Hask范畴中的元素对象是Haskell的类型,态射箭头是Haskell的函数。 

 

类型

  类型是值的集合,比如类型Bool(Haskell核心类型是大写开始)是一个有两个元素的集合,这两个元素 是True和False,类型Char是所有Unicode字符如'a'或'b'的集合。

  函数也是有类型的,函数的类型是其输入输出的综合,比如f函数是输入类型A到输出类型B:B f(A a); 在 Haskell中是如下表达:

f ∷ A → B

  因此区别两个函数的不同,我们可以从其输入类型和输出类型上区别。

  函子functor是比函数更高阶的函数,函子是作用于两个范畴之间的函数,但是根本上也是一个函数,因此函子的类型与上面的函数类型差不多。假设两个范畴是 C和D, 其函函子是:

functor F: C -> D  

 

函子functor原理

  函数组合的方式有其特殊地方,这个特殊主要是由于我们组合的对象是函数,如果组合的对象是整数类型,两个整数组合成一个整数,这没有问题,但是你不能将两个函数类型组合起来还是和原来函数类型一样。比如我们将两个f函数f ∷ A → B组合起来,就不会得到还是A → B。 

  函子functor是比函数更高阶的函数,函子是作用于两个范畴之间的函数,可以简单认为是两个集合之间的映射。范畴的映射转换需要转换其中的元素和态射。

  假设两个范畴是 C和D, 有一个函子functor F: C -> D ,这种写法类似函数写法,但是因为函子是范畴的函数,所以,其工作原理是进入范畴C和D内部,而范畴是由元素对象和态射箭头组成,因此函子就要分别作用于元素对象和态射箭头。 

  映射元素对象:C中的任何对象A转变成了D中的F(A);

  映射态射箭头:C中的态射f: A -> B转变成了D中的F(f): F(A) -> F(B) 。  
  (组合箭头和元箭头映射这里省略)

 

http://www.jdon.com/idea/monad.html

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

你可能感兴趣的文章
微信公众号开发将war包导入新浪sae出现错误
查看>>
01-Jvm 内存区域复习笔记
查看>>
9.7 迭代
查看>>
纪念中国反毒之父—王江民
查看>>
C#(数据结构):1.顺序表结构(2)
查看>>
C语言 文件操作| 文件打开
查看>>
高并发学习(一)高并发的问题/线程安全性/锁/可见性/有序性
查看>>
多重catch语句
查看>>
java对cookie的操作_01
查看>>
支付宝移动支付
查看>>
恋家-bs4
查看>>
服务治理利器Hystrix-理论篇
查看>>
Java 工厂方法模式
查看>>
coursera上的软件安全课程的课后阅读补充
查看>>
通过XMLHttpRequest和jQuery实现ajax的几种方式
查看>>
Why do I get the error "The target GatherAllFilesToPublish does not exist"?
查看>>
根据rowid删除最新数据(rowid最大为最新数据)(转)
查看>>
进程和线程的概念,区别(理论知识)
查看>>
Android eclipse环境搭建
查看>>
platform平台总线
查看>>