Category

  1. class Category cat where
  2. id :: cat a a
  3. (.) :: cat b c -> cat a b -> cat a c
  4. instance Category (->) where
  5. id = GHC.Base.id
  6. (.) = (GHC.Base..)
  7. (<<<) :: Category cat => cat b c -> cat a b -> cat a c
  8. (<<<) = (.)
  9. (>>>) :: Category cat => cat a b -> cat b c -> cat a c
  10. f >>> g = g . f
  • Category(范畴)是个类型类,它包含两个函数。

    id函数是Category类型类的幺元。

    (.)函数是Category类型类的组合子。

    id函数和(.)函数形成了一个幺半群(Monoid)。
  • 对于(->)函数操作符这个实例来说

    id函数和(.)函数的定义就是GHC.Base模块中的同名函数。
  • (<<<)函数与(.)同义。

    (>>>) 函数则相当于 flip (.)。

category theory(范畴论)中的 category(范畴)

在范畴论中,一个范畴包括

  • A collection of objects.

    一个对象的集合。
  • A collection of morphisms.

    一个态射的集合。每个态射绑定两个对象:一个输入,一个输出。

    若态射 f 绑定了一个输入对象 A 一个输出对象 B,则它可以被记作

    f : A -> B.
  • A notion of composition of these morphisms.

    态射的组合。

    态射 g : A -> B 可以和态射 f : B -> C 组合成新的态射 f . g : A -> C。

范畴的法则

  • 态射的组合满足结合律。即

    (f . g) . h = f . (g . h)
  • 态射的组合是封闭的。即

    态射组合后形成的新态射仍然必须在范畴之内。
  • 存在单元态射 id。即

    id . g = g . id = g

Haskell语言中的范畴

Haskell语言中的范畴被称为Hask

  • Hask范畴中的对象为类型。
  • Hask范畴中的态射为函数。
  • Hask范畴中态射的组合子是函数 (.)。
  • Hask范畴中的单元态射是函数 id。

范畴论中的 Functor(函子)

Functor是范畴之间的转换器。

给定范畴 C 和 D,函子 F : C -> D 可以将

  • 任何 C 中的对象 A 映射成 D 中的对象 F(A)。
  • 任何 C 中的态射 f : A -> B 映射成 D 中的态射 F(f) : F(A) -> F(B)。

范畴论中的 Monad(单子)

Monad是一种特殊的Functor。

  • Monad M 的映射关系建立在某个范畴 C 自身之上。

    即Monad可以被记作 M : C -> C。
  • 对于范畴 C 中的任何对象 X,都存在两个特殊映射

    unit : X -> M(X)

    join : M(M(X)) -> M(X)

Haskell语言学习笔记(39)Category的更多相关文章

  1. Haskell语言学习笔记(88)语言扩展(1)

    ExistentialQuantification {-# LANGUAGE ExistentialQuantification #-} 存在类型专用的语言扩展 Haskell语言学习笔记(73)Ex ...

  2. Haskell语言学习笔记(79)lambda演算

    lambda演算 根据维基百科,lambda演算(英语:lambda calculus,λ-calculus)是一套从数学逻辑中发展,以变量绑定和替换的规则,来研究函数如何抽象化定义.函数如何被应用以 ...

  3. Haskell语言学习笔记(69)Yesod

    Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...

  4. Haskell语言学习笔记(20)IORef, STRef

    IORef 一个在IO monad中使用变量的类型. 函数 参数 功能 newIORef 值 新建带初值的引用 readIORef 引用 读取引用的值 writeIORef 引用和值 设置引用的值 m ...

  5. Haskell语言学习笔记(72)Free Monad

    安装 free 包 $ cabal install free Installed free-5.0.2 Free Monad data Free f a = Pure a | Free (f (Fre ...

  6. Haskell语言学习笔记(44)Lens(2)

    自定义 Lens 和 Isos -- Some of the examples in this chapter require a few GHC extensions: -- TemplateHas ...

  7. Haskell语言学习笔记(38)Lens(1)

    Lens Lens是一个接近语言级别的库,使用它可以方便的读取,设置,修改一个大的数据结构中某一部分的值. view, over, set Prelude> :m +Control.Lens P ...

  8. Haskell语言学习笔记(92)HXT

    HXT The Haskell XML Toolbox (hxt) 是一个解析 XML 的库. $ cabal install hxt Installed hxt-9.3.1.16 Prelude&g ...

  9. Haskell语言学习笔记(91)Comprehension Extensions

    Comprehension Extensions 关于解析式的相关语言扩展. List and Comprehension Extensions 24 Days of GHC Extensions: ...

随机推荐

  1. Jenkins进阶-获取git tags代码(2)

    配置Jenkins获取git tag代码的方式其实方法很多,目前我使用比较多的主要是通过Git Parameter 来配置动态的获取最新tags代码,主要我们首先需要安装一下Git Parameter ...

  2. jmeter自动生成报告

    从JMeter 3.0开始已支持自动生成动态报告,我们可以更容易根据生成的报告来完成我们的性能测试报告. 如何生成html测试报告 如果未生成结果文件(.jtl),可运行如下命令生成报告: jmete ...

  3. 基于ionic框架封装一个图片轮播指令的几点

    在这里我想在项目中封装一个图片轮播的指令 (本项目使用的是ionic框架) 1)定义指令 define(['app'],function(myapp){ myapp.directive('myslid ...

  4. Microsoft Dynamics CRM 2011 中 SQL 语句总结

    一.查询用户和团队 插入的类型:OwnerIdType 可以为用户或团队: 1.团队: select top 1 ObjectTypeCode from metadataschema.entity w ...

  5. Django Ajax登录 防止CSRF

    什么是CSRF 维基百科: 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CS ...

  6. vscode美化方法以及定制主题插件

    首先是学会调整字体和字体大小 换成你看着舒服的字体和字体大小,当然,通常情况下默认的就很好看,但每个人的显示屏参数不同显示起来的效果因人而异,如果你有更好的方案不妨设置一下 下面展示我的浅色主题和深色 ...

  7. 论战大数据----胖子哥的PK之旅(一)

    胖子哥(1106110976) 9:35:36 http://www.cnblogs.com/hadoopdev/p/3531963.htmlnosqlt数据库-肖(380594863) 9:38:0 ...

  8. Hadoop专业解决方案之构建Hadoop企业级应用

    一.大数据的挑战 大数据面对挑战是你必须重新思考构建数据分析应用的方式.传统方式的应用构建是基于数据存储在不支持大数据处理的基础之上.这主要是因为一下原因: 1.传统应用的基础设施是基于传统数据库访问 ...

  9. bzoj4385 Wilcze doły

    Description 给定一个长度为n的序列,你有一次机会选中一段连续的长度不超过d的区间,将里面所有数字全部修改为0.请找到最长的一段连续区间,使得该区间内所有数字之和不超过p. Input 第一 ...

  10. 一个PHPer的规划

    前言:学PHP过时了吗?PHP开发人员如何快速成长?怎么进行职业规划?特别是近几年非常火热的人工智能,机器学习,区块链技术等等,这多少会带动一些人盲目跟风,迷茫等,下面是PHP大牛魏永强带来的一篇根据 ...