函子

引言

上一篇文章介绍了范畴论的一些基本概念,范畴,对象,态射。并且用了一些编程语言的例子去实践了这些理论的东西。但这还不足以让我们对函数式编程有个深刻的理解,因为还有一些概念是我们必须要知道,比如函子。

什么是函子

函子(Functor)在维基百科中说,

在范畴论中,函子是范畴间的一类映射。函子也可以解释为小范畴范畴内的态射。

我们先记住前面一句话,函子是范畴间的一类映射。我们知道,态射是范畴内对象之间的映射关系。函子与它类似,函子是范畴与范畴间的映射关系,也就是可以通过一个函子,把一个范畴映射到另一个范畴。

这里写图片描述

上图中有两个范畴 C 和 D,还有一个函子 F,意思是范畴 C 通过函子 F 映射到了D。
我们用白话描述一下函子的定义,免得陷入各种希腊字母的公式中。
- 范畴 C 中的每一个对象,都可以映射到范畴 D 上的一个对象(这个可以多对一);
- 范畴 C 中的每一个态射 f: X->Y ,都可以遇到到范畴 D 上的相应态射 F(f) : F(X)->F(Y), 包括单位态射;
- 映射后的态射的复合规则依然被保持,即 f:X->Y, g:Y->Z, 恒有 F(g.f)=F(g).F(f)。

还有,把一个范畴映射到自身的函子叫做自函子。

实例

回到上面给出的图示中解释一下函子。
上面有个函子,把范畴 C 中的 string 映射到了范畴 D 中的 List[string],同样把 int 映射到了 D 中的 List[int]。并且态射 f 和单位态射也依然保持。
我们来看一下实际的例子:

template<class C, class D>
std::list<D> fmap(std::function<D (C)> f, std::list<C> c)
{
  std::list<D> d;
  std::transform(std::begin(c),
      std::end(c),
      std::back_inserter(d),
      f);
  return d;
}

int main() {
  std::list<std::string> c;
  c.push_back("1");
  c.push_back("2");

  std::list<int> c1 = fmap<std::string, int>([](std::string obj) -> int {
    return atoi(obj.c_str());
  }, c);

  return 0;
}

由于语法的局限性,这段代码写的并不漂亮,但也大致能体现出函数子的意思。
我们对照定义来解析一下:
对象的映射,如 string 映射到 list 体现在由类型的转换中,在模板实例化时,其实就暗含着 string 到 list 的转换,只不过这里的 string,和 list 各是范畴 C 和范畴 D 里的对象;
那态射的映射体现在哪里呢?即态射 f: string->int 映射到哪里了呢?
这里的 f 相当于一个签名为输入类型为 C ,输出类型为 D 的函数,它应该映射到输入类型为 std::list ,输出为类型 std::list 的函数,即这里的 fmap 所做的过程。
这里的 fmap 在实例化以及运算的过程,相当于函子的原理,其实所有带有这种工作原理与 fmap 相似的结构都可以叫函子。

自函子(Endofunctor)

假设我们现在把我们的范畴定义的更大一些,定义它的对象包含了我们见过的所有类型,其它它是一个无限集,因为 std::list 这样也是类型,也相当于这个范畴的对象,并且可以无限扩展,比如 list

结束语

有时候一些习以为常的代码里暗含着一些理论基础,当理解了这些理论基础以后,会更加清晰地认识到这些代码背后的思想。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《格里菲斯P.哈里斯J.代数几何原理》是一本经典的代数几何教材。本书的作者是Philip Griffiths和Joseph Harris。这本书是代数几何领域的经典教材之一,由几何和代数两个角度对代数几何的基本理论和方法进行了详细介绍。 这本书主要分为四个部分。第一部分介绍了代数几何的基础知识,包括复流形、层论、拓扑学和交换环论等。它为后续内容的理解打下了坚实的基础。 第二部分讨论了仿射代数簇和射影代数簇的基本概念和性质。介绍了代数簇的定义、闭集的定义和性质,以及经典的Hilbert's Nullstellensatz定理等。此外,还介绍了射影空间和射影簇的概念,并讨论了它们之间的联系。 第三部分着重介绍了层论在代数几何中的应用。层论是代数几何中重要的工具,它将代数对象与拓扑空间相联系。本部分详细介绍了预层、层、层的性质等概念,并探讨了层在代数几何中的应用。 第四部分阐述了几个重要的代数几何理论和方法,如Cech上同调、切空间和余切空间、流形上的层等。这些理论和方法在代数几何的研究中具有重要的作用,并在其他数学领域中也有广泛的应用。 《格里菲斯P.哈里斯J.代数几何原理》作为一本经典教材,既适合作为代数几何专业学生的教材,也适合作为对代数几何感兴趣的数学学生的参考书。它深入浅出地介绍了代数几何的基本概念、理论和方法,对于读者进一步深入学习和研究代数几何领域非常有帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值