自函子

自函子(Endofunctor)是一个将范畴映射到自身的函子(A functor that maps a category to itself)。

函子是将一个范畴转换到另一个范畴。所以自函子是一种特殊的函子。

由三部分组成:

  1. 一组元素对象
  2. 一组态射
  3. 态射组合(二元运算)

假设这个范畴满足结合律,那么它是一个半群;假设半群满足幺元(单位元。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的更多相关文章

  1. 【函数式】Monads模式初探——for解析式

    for表达式是monad语法糖 先看一组演示样例: case class Person(name: String, isMale: Boolean, children: Person*) val la ...

  2. Go语言设计模式之函数式选项模式

    Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...

  3. Java8之旅(七) - 函数式备忘录模式优化递归

    前言 在上一篇开始Java8之旅(六) -- 使用lambda实现Java的尾递归中,我们利用了函数的懒加载机制实现了栈帧的复用,成功的实现了Java版本的尾递归,然而尾递归的使用有一个重要的条件就是 ...

  4. Java8函数之旅 (七) - 函数式备忘录模式优化递归

    前言 在上一篇开始Java8之旅(六) -- 使用lambda实现Java的尾递归中,我们利用了函数的懒加载机制实现了栈帧的复用,成功的实现了Java版本的尾递归,然而尾递归的使用有一个重要的条件就是 ...

  5. Scalaz(10)- Monad:就是一种函数式编程模式-a design pattern

    Monad typeclass不是一种类型,而是一种程序设计模式(design pattern),是泛函编程中最重要的编程概念,因而很多行内人把FP又称为Monadic Programming.这其中 ...

  6. .Net平台-MVP模式初探(一)

    为什么要写这篇文章 笔者当前正在负责研究所中一个项目,这个项目基于.NET平台,初步拟采用C/S部署体系,所以选择了Windows Forms作为其UI.经过几此迭代,我们发现了一个问题:虽然业务逻辑 ...

  7. Android开发之模板模式初探

    模板模式我认为在Android的开发中是最长用到的,基本是随处可见的,认识该模式,有助于我们对Android的源代码及框架有一个更深层次的认识.那什么是模板模式呢,模板模式就是定义一个基本框架,将当中 ...

  8. Android开发之Buidler模式初探结合AlertDialog.Builder解说

          什么是Buidler模式呢?就是将一个复杂对象的构建与它的表示分离,使得相同的构建过程能够创建不同的表示.Builder模式是一步一步创建一个复杂的对象,它同意用户能够仅仅通过指定复杂对象 ...

  9. 菜鸟vimer成长记——第2.0章、模式初探

    首先,其他的文本编辑器只有一种模式,就是插入模式.而vim一下子颠覆了我们的世界观——有好多模式.这个是思维上的切换,很难也很重要!!! 其次,Vim 提供一个区分模式的用户界面.也就是说在不同的模式 ...

随机推荐

  1. Beauty Contest(凸包求最远点)

    http://poj.org/problem?id=2187 题意:求凸包上最远点距离的平方 思路:开始用旋转卡壳求的最远点,WA,改了好久..后来又改成枚举凸包上的点..AC了.. #include ...

  2. Android开发中的日期格式化

    下面的转换符来自Java,但是在android中同样可用.(以下表格内容来自互联网.) 常见日期格式化转换符 转换符 说 明 示 例 %te  一个月中的某一天(1-31)  2 %tb  指定语言环 ...

  3. B - String Task

    Problem description Petya started to attend programming lessons. On the first lesson his task was to ...

  4. Phoenix与Squirrel 是什么?

    不多说,直接上干货! 前言 Phoenix是HBase的开源SQL引擎. squirrel是windows上Phoneix可视化工具.  Phoenix的官网 http://phoenix.apach ...

  5. 【Oracle】服务器端监听配置

    一.静态监听 创建端口为1521的监听,静态注册,本机ip:192.168.10.2 [oracle@localhost ~]$ vi /u01/app/oracle/product/11.2.0/d ...

  6. 【python】os.getcwd和getcwdu

    print os.getcwd(), type(os.getcwd()) print os.getcwdu(), type(os.getcwdu()) 结果如下: C:\Users\Administr ...

  7. CXF-JAX-RS开发(一)入门案例

    一.简介 资源驱动.基于HTTP协议[按照标准指定URL,就可以访问数据]以XML|JSON格式传输数据. 二.quickstart 1.创建maven project[Packaging:jar] ...

  8. Yoga710笔记本Win10和Ubuntu系统共存

    联想yoga710默认安装了win10系统,且使用EFI分区格式,安装Ubuntu不是一般的困难,经公司小哥的帮助下,几次终于完成了Ubuntu和Win10 共存. 经过多次安装测试,暂时能运行成功的 ...

  9. Arduino LM35温度检测

    一. 接线原理图 二.实物图 三.代码例子

  10. HDU_5833_高斯消元

    参考自:http://www.cnblogs.com/flipped/p/5771492.html 自己做的时候不知道如何求种数.看了题解,感觉思路灰常巧妙.同时也感觉这是一道好题. 精髓在于转化为线 ...