【函数式】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 提供一个区分模式的用户界面.也就是说在不同的模式 ...
随机推荐
- JS网页播放声音实现代码兼容各种浏览器
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- [Swift]LeetCode1064. 不动点 | Fixed Point
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- TCP排查常用命令
1.查看TCP连接状态命令 netstat -n | awk '/^tcp/ {++state[$NF]} END {for(key in state) print key,"\t" ...
- Blender之UILayout
目标 [x] 总结Blender面板布局 总结 Blender面板中界面组件是通过UILayout进行组织的. 其主要属性如下: row() 定义横向子布局. column() 定义竖向子布局. sp ...
- D - Replacement
Problem description Little Petya very much likes arrays consisting of n integers, where each of them ...
- layer的基本使用
layer是layui独立出来的一个弹出层模块 <!DOCTYPE html> <html> <head> <meta charset="UTF-8 ...
- windows phone数据网络开发
LINQ LINQ的全称是Language INtegrated Query,即语言集成查询.LINQ是一种查询语言,不仅可以对数字库进行查询,还可以对.net的数据集.数组.Xml文档等对象进行查询 ...
- word中选择嵌入式时图片被遮住,只显示小部分的解决方法
选中图片,点击如下 选择 行距选项 将行距改为单位行距即可.
- PL/SQL之高级篇
原文地址:http://www.cnblogs.com/sin90lzc/archive/2012/08/30/2661117.html 参考文献:<Oracle完全学习手册> 1.概述 ...
- html5 web worker学习笔记(记一)
(吐槽:浏览器js终于进入多线程时代!) 以前利用setTimeout.setInterval等方式的多线程,是伪多线程,本质上是一种在单线程中进行队列执行的方式.自从html5 web worker ...