函子定律

作者: Sheepy | 来源:发表于2017-02-09 11:00 被阅读218次

前段时间学了下 Haskell,看完了《Haskell 趣学指南》,刷了一些题,《Real World Haskell》正在看。因为早先看过《SICP》,有点 FP 的基础,平常写 Swift 也喜欢用些 FP 的技巧,所以暂时没有什么特别颠覆性的感觉。最大的感受是,以前对 Functor、Applicative 和 Monad 的理解太片面了。

Functor

谈 Monad(单子) 之前还是要谈谈 Functor(函子),毕竟所有的 Monad 都是 Functor。在范畴论中,函子是范畴间的一类态射(这个定义给我的直观感受是函子指的是 fmap 函数……),数学上的概念就不多说了,下面我们来看看 Haskell 中的 Functor。

Haskell 中有一个叫 Functor 的类型类(暂时可以粗略地理解为 OO 语言中的接口),它的定义是这样的:

class Functor f where
  fmap :: (a -> b) -> f a -> f b

Functor 的实例不是一个具体的类型,而是一个类型构造器(暂时理解为类似范型类的东西),譬如 Int、Maybe Int 都是具体类型,而 Maybe 就是个类型构造器。所以从 Functor 的定义来看,似乎只要实现了 fmap 函数的类型构造器,就是函子了。事实上并不是这样,函子毕竟是一个数学概念,它必须满足函子定律:

fmap id = id
famp (f . g) = fmap f . fmap g

id 是一个原样返回参数的函数(id x = x),.表示函数组合(f . g = \x -> f (g x))。这两条定律可以保证在一个函子值上执行 fmap 只会在它上面映射一个函数——不再做其他事情。

相关文章

  • 函子定律

    前段时间学了下 Haskell,看完了《Haskell 趣学指南》,刷了一些题,《Real World Haske...

  • Applicative 函子

    Applicative 定律 Application 函子是一种加强的函子,在 Haskell 的 Control...

  • 详解函数式编程中的函子

    本文目录:1.什么是函子2.MayBe函子3.Either函子4.Pointed函子5.IO函子6.IO函子存在的...

  • 函数式编程(五)—— 函子

    Functor为什么要学函子?什么是Functor理解Functor总结MyBe函子Either函子IO函子Tas...

  • 【函数式】Monads模式初探——Endofunctor

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

  • 5.范畴的例子

    接着学习函子,函子是范畴之间的结构保持映射。 给出两个函子,通过逐点复合的方式可以得到一个新的函子,可以验证,这种...

  • 函子

  • JS函数式编程03--函子

    函子 函子的概念 函子是函数式编程里面最重要的数据类型,也是基本的运算单位和功能单位。函子首先是一个容器,它包含了...

  • 31.限制保持函子

    这一节关注于,与限制结构交换的函子 一个函子称之为保持限制的,当对任意小范畴和任意函子,如果限制存在,那么经过函子...

  • 39.函子范畴的限制

    我们考察函子和自然映射构成的范畴中的限制的存在性。 考虑范畴ACD,其中CD是小范畴。设是一个函子,代表函子范畴。...

网友评论

    本文标题:函子定律

    本文链接:https://www.haomeiwen.com/subject/klmbittx.html