【函数式】Monads模式初探——Endofunctor
自函子
自函子(Endofunctor)是一个将范畴映射到自身的函子(A functor that maps a category to itself)。
函子是将一个范畴转换到另一个范畴。所以自函子是一种特殊的函子。
由三部分组成:
- 一组元素对象
- 一组态射
- 态射组合(二元运算)
假设这个范畴满足结合律,那么它是一个半群;假设半群满足幺元(单位元。identity),那么它是幺半群(Monoid)。
因此。函子是将一个Monoid中的元素对象映射到另外一个Monoid的元素对象,态射也是这么映射的。而自函子映射的这两个Monoid是同一个。
假设这个自函子为F。则对于F[Int]作用的结果仍是Int。对于函数f: Int=>String映射的结果F[f]也仍是函数f。所以自函子对范畴中的元素和关系不做不论什么改变。
Hask范畴
Haskell里的全部类型和函数都放到一个范畴里,取名为Hask。
解释上图,A,B代表普通类型如String,Int,Boolean等,这些(有限的)普通类型是一组类型集合,另一组类型集合是衍生类型(即由类型构造器与类型參数组成的),这是一个无限集合(能够无限衍生下去)。这样范畴Hask就涵盖了haskell中全部的类型。
对于范畴Hask来说。假设有一个函子F。对里面的元素映射后,其结果仍属于Hask,比方我们用List这个函子:
List[A], List[List[A]], List[List[List[A]]]…
发现这些映射的结果也是属于Hask范畴(子集),所以这是一个自函子,实际上在Hask范畴上的全部函子都是自函子。
分形
Hask范畴结构是一个分形(fractal)结构。
如上面的这片叶子。它的每一簇分支。形状上与总体的形状是全然一样的,即局部与总体是一致的结构。而且局部能够再分解下去。
这样的结构在函数式语言里也是非经常常使用的。最典型的如List结构,由head和tail两部分组合而成。而每一个tail也是一个List结构,能够递归的分解下去。
特别说明
因为关于自函子的中文介绍比較少,所以这篇文章我基本都是引用hongjiang的自函子(Endofunctor)是什么。
希望加深理解之后。再填充很多其它原创内容。
转载请注明作者Jason Ding及其出处
jasonding.top
Github博客主页(http://blog.jasonding.top/)
CSDN博客(http://blog.csdn.net/jasonding1354)
简书主页(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
Google搜索jasonding1354进入我的博客主页
【函数式】Monads模式初探——Endofunctor的更多相关文章
- 【函数式】Monads模式初探——for解析式
for表达式是monad语法糖 先看一组演示样例: case class Person(name: String, isMale: Boolean, children: Person*) val la ...
- Go语言设计模式之函数式选项模式
Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...
- Java8之旅(七) - 函数式备忘录模式优化递归
前言 在上一篇开始Java8之旅(六) -- 使用lambda实现Java的尾递归中,我们利用了函数的懒加载机制实现了栈帧的复用,成功的实现了Java版本的尾递归,然而尾递归的使用有一个重要的条件就是 ...
- Java8函数之旅 (七) - 函数式备忘录模式优化递归
前言 在上一篇开始Java8之旅(六) -- 使用lambda实现Java的尾递归中,我们利用了函数的懒加载机制实现了栈帧的复用,成功的实现了Java版本的尾递归,然而尾递归的使用有一个重要的条件就是 ...
- Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern
Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...
- .Net平台-MVP模式初探(一)
为什么要写这篇文章 笔者当前正在负责研究所中一个项目,这个项目基于.NET平台,初步拟采用C/S部署体系,所以选择了Windows Forms作为其UI.经过几此迭代,我们发现了一个问题:虽然业务逻辑 ...
- Android开发之模板模式初探
模板模式我认为在Android的开发中是最长用到的,基本是随处可见的,认识该模式,有助于我们对Android的源代码及框架有一个更深层次的认识.那什么是模板模式呢,模板模式就是定义一个基本框架,将当中 ...
- Android开发之Buidler模式初探结合AlertDialog.Builder解说
什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得相同的构建过程能够创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它同意用户能够仅仅通过指定复杂对象 ...
- 菜鸟vimer成长记——第2.0章、模式初探
首先,其他的文本编辑器只有一种模式,就是插入模式.而vim一下子颠覆了我们的世界观——有好多模式.这个是思维上的切换,很难也很重要!!! 其次,Vim 提供一个区分模式的用户界面.也就是说在不同的模式 ...
随机推荐
- (Go)04.go工作区目录规范及简单例子
一.规范目录结构 D:\project\src\go_dev\day1\example1 二.设置GOPAH环境变量 三.hello world 1.hello world package main ...
- HDU 1166 线段树模板&树状数组模板
HDU1166 上好的线段树模板&&树状数组模板 自己写的第一棵线段树&第一棵树状数组 莫名的兴奋 线段树: #include <cstdio> using nam ...
- 在使用实体框架(Entity Framework)的应用中加入审计信息(Audit trail)跟踪数据的变动
在一些比较重要的业务系统中,通常会要求系统跟踪数据记录的变动情况.系统要记录什么时间,什么人,对那些信息进行了变动. 比较简单的实现方式是在每个表中加入两个字段CreatedBy和CreatedAt, ...
- System.net.mail发送电子邮件
之前做的实现发送邮件的功能,基于System.net.mail,在本地测试是可以发送邮件的,发布到服务器上发送不了邮件,后来发现STMP默认使用25端口收发邮件,服务器封掉25了端口,导致发送邮件失败 ...
- java中equals方法和==的用法
java中equals方法的用法以及==的用法(参考一)equals 方法是 java.lang.Object 类的方法.两种用法说明:(1对于字符串变量来说,使用“==”和“equals()”方法比 ...
- android studio高德地图的显示于定位(附带逆地理编码围栏)
首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息 网站:http://lbs.amap.com/api/android-sdk/guide/create-p ...
- Sobel算子取代:基于特定点方向的canny边缘检测
前言: Canny边缘检测使用了Sobel算子,计算dx和dy两个方向,对于特定方向的边缘检测,可以作少量修改. 代码: 计算特定方向上的边缘 void CannyOrient( cv::Mat &a ...
- 【sqli-labs】 less19 POST - Header Injection - Referer field - Error based (基于头部的Referer POST报错注入)
这个和less18一样,都是基于header的注入 这次的字段是referer Referer: ' AND UpdateXml(1,concat(0x7e,database(),0x7e),1),1 ...
- Arduino 9g舵机操作
一.接线原理图 一.实物图 三.事例代码 从0转180度,再从180转到0度
- .Net Core 中X509Certificate2 私钥保存为 pem 的方法
在自己签发CA证书和颁发X509证书时,私钥通过下面的方法保存为PEM 相关代码可以已经提交在了 https://github.com/q2g/q2g-helper-pem-nuget/pull/13 ...