Category

class Category cat where
id :: cat a a
(.) :: cat b c -> cat a b -> cat a c instance Category (->) where
id = GHC.Base.id
(.) = (GHC.Base..) (<<<) :: Category cat => cat b c -> cat a b -> cat a c
(<<<) = (.)
(>>>) :: Category cat => cat a b -> cat b c -> cat a c
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. requestAnimationFrame 提高动画性能的原因

    与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机.具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新 ...

  2. mysql九大类常用函数

    一.数学函数 ABS(x) 返回x的绝对值BIN(x) 返回x的二进制(OCT返回八进制,HEX返回十六进制)CEILING(x) 返回大于x的最小整数值EXP(x) 返回值e(自然对数的底)的x次方 ...

  3. Postgresql 创建账户,修改密码

    sudo su postgres psql \password postgres输入密码\q 本机调试的时候,最好在装完以后添加一个pgsql的管理员帐号,否则phppgadmin不让登陆 创建用户 ...

  4. MFC的组合框(ComboBox)控件切换下拉样式

    由于课题的需求需要做MFC串口程序,看了百度下载的串口助手的界面风格,发现这个设计很好 波特率的组合框只给出了5个可选数值,然后第6个选项是Custom,即手动输入. 实际上DCB结构的BaudRat ...

  5. 原来zabbix监控进程与端口是如此的简单!

    使用zabbix自带key监控进程与端口 每个公司都有自己的程序,自己的进程名与端口监听,对于nagios来说,这些都经常需要自己去写插件,但是zabbix不需要,它自己就有监控进程与端口的key. ...

  6. nginx_auto_deny

    nginx auto deny 流量/访问限制脚本 https://files.cnblogs.com/files/ligao/nginx_deny_ip.tar.gz

  7. HUD 2639 Bone Collector II

    Bone Collector II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  8. python的XML处理模块ElementTree

    ElementTree是python的XML处理模块,它提供了一个轻量级的对象模型.它在Python2.5以后成为Python标准库的一部分,但是Python2.4之前需要单独安装.在使用Elemen ...

  9. python3中reduce()函数的使用方法示例

      reduce() 函数会对参数序列中元素进行累积,下面这篇文章主要给大家介绍了关于python中reduce()函数的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学 ...

  10. 在配置静态IP的时候遇到 :bringing up interface eth0 : error unknown connection

    首先这是动态ip配置成功的结果 接下来切换到root用户来配置静态的 按照静态ip的配置方法配置好文件后(具体过程这里就不多加说明) 然后保存退出 当我们重启网卡的时候问题来了(因为本人有点强迫症,多 ...