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. commonJS规范基本结构

    commonJS规范:使用 module.exports 和 require ,基本结构如下: // foo.js 输出模块 module.exports = function(x) { consol ...

  2. FineUI 3升级4.1.1时,SingleClickExpand属性改什么了? (树控件单击展开)

    private Tree InitTreeMenu(List<Menu> menus) { Tree treeMenu = new Tree(); treeMenu.ID = " ...

  3. golang panic的捕获

    panic发生时, 会导致进程挂掉.为了处理panic, 可以使用recover捕获,然后处理. 下面以下标引用越界问题为例进行说明. 正常情况下,代码中如果出现下标越界,会直接触发panic, 导致 ...

  4. Selenium2+python自动化42-判断元素(expected_conditions)

    前言 经常有小伙伴问,如何判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,在selenium的expected_conditions模块收集了一系列的场景判断方 ...

  5. Javascript中的闭包(六)

      一.什么是闭包  函数可以记住并访问所在词法作用域时,就产生了闭包,即使在词法作用域外调用函数. (也就是说如果一个函数在执行完之后,其中的内部包含的函数仍然对该函数的作用域持有着引用(函数执行完 ...

  6. bzoj1212 L语言

    Description 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D ...

  7. bzoj1833 数字计数

    Description 给定两个正整数a和b,求在[a,b]中的所有整数中,每个数码(digit)各出现了多少次. Input 输入文件中仅包含一行两个整数a.b,含义如上所述. Output 输出文 ...

  8. 服务注册发现consul之五:Consul移除失效服务的正确姿势

    spring cloud微服务不定期会出现网络请求失败的错误.于是看了下后台日志,发现有几个请求会报如下的异常: Caused by: feign.RetryableException: Connec ...

  9. 学习笔记之Moq

    dotnet/src/MoqSample at master · haotang923/dotnet · GitHub https://github.com/htanghtang/dotnet/tre ...

  10. 检测2个公网IP的GRE隧道是否通的方法,使用PPTP拨号检测。

    检测2个公网IP的GRE隧道是否通的方法,使用PPTP拨号检测. 因为PPTP是建立在GRE隧道基础上的. PPTP 防火墙开放 TCP 1723防火墙开放 IP protocol 47,即GRENA ...