假人的递归方案?


83

我正在寻找一些非常简单,易于掌握的递归方案和核心递归方案(催化变形,变形,同形等)的解释,它们不需要遵循大量的链接或打开类别理论教科书。我敢肯定,我在不知不觉中重塑了许多这样的方案,并在编码过程中将它们“应用”到了我的脑海中(我相信我们中的许多人都有),但是我不知道我的(共)递归方案是什么。使用被称为。(好的,我撒谎了。我只是在阅读其中的一些内容,这引发了这个问题。但是在今天之前,我还没有头绪。)

我认为这些概念在编程社区中的传播受到了人们可能会遇到的令人难以理解的解释和示例的阻碍,例如,在Wikipedia上以及在其他地方。

他们的名字也可能阻碍了它。我认为还有一些其他的数学名称较少(关于香蕉和铁丝网的东西?),但我也不知道我使用的递归方案的更可爱的名称是什么。

我认为使用示例数据类型代表简单的实际问题,而不是抽象数据类型(例如二叉树)会有所帮助。


6
杰里米·吉本斯(Jeremy Gibbons)有几篇论文可能是最好的介绍,因为它们清晰易懂,且内容丰富。“流式表示更改器”(折叠和展开合并),“程序理解的裂变”(同形等),“欣赏不足的展开”(同构)。cs.ox.ac.uk/people/publications/date/Jeremy.Gibbons.html
斯蒂芬·泰特利2011年

Answers:


44

极其宽松地讲,fold变形是的略微概括,而变形是的略微概括。unfold。(同构只是展开,然后是折叠)。通常以更严格的形式展示它们,以使与类别理论的联系更加清晰。密集形式使我们能够区分数据(初始代数的必然有限乘积)和协数据(最终代数的可能无限乘积)。这种区别使我们可以保证在无限列表上永远不会调用弃牌。通常写出同构和同构的有趣方式的另一个原因是,通过对F-代数和F-coalgebras(从函子生成)进行运算,我们可以一劳永逸地编写它们,而不是一次遍历一个列表一次。二叉树等,这反过来又有助于弄清楚究竟为什么他们都是同样的事情。

但是从纯粹的直觉角度来看,您可以将cata和ana视为还原和生产,仅此而已。

编辑:多一点

变质(长臂猿)就像一个由内而外的光环-它先是折叠,然后是展开。因此,您可以使用它来断开流并建立具有潜在不同结构的新流。

埃克梅特(Ekmett)在文献中为各种方案发布了不错的“现场指南”:http : //comonad.com/reader/2009/recursion-schemes/

但是,尽管“直观”的解释很简单,但链接的代码却不是那么简单,其中一些博客文章在复杂/禁止的方面可能有点不合时宜。

话虽这么说,但也许除了组织进化论之外,我认为动物园的其余部分不一定是您大部分时间想直接考虑的事情。如果“获得” hylo和meta,则仅凭它们就可以表达几乎任何内容。通常,其他态射的限制性更高,而不是更少(因此,“免费”为您提供更多属性)。


1
好的,谢谢,但这只是这三个-还有其他。我希望有人会添加一个关于其他递归方案的答案。
罗宾·格林

3
剩下的大多数递归方案都是模糊的,除了可能是同态的,这与我们在依赖语言中经常看到的类型的“归纳原理”非常吻合。我还没有弄清楚所有类别理论是如何工作的,但是我怀疑它会太可怕地打破:)
copumpkin 2011年

3
多态性就像一个折叠,但是您可以浏览“其余输入”。折叠仅使您在遍历期间具有基本访问权限。
斯蒂芬·泰特利2011年

23

从最符合类别的理论(但与给出“领土地图”有关,这将使您避免“单击大量链接”)相关的一些参考文献,变得更简单,更完备:

  • 就“香蕉和铁丝网”词汇而言,它来自Meijer,Fokkinga和Patterson的原始论文(以及其他作者的续篇),总的来说,与那些不太可爱的替代品一样,它的符号种类繁多: “名称”(香蕉等)只是它们所关联的结构的ascii符号的图形外观的快捷方式。例如,用表示同形(即褶皱)(| _ |),并且括号内的括号看起来像“香蕉”,因此得名。这是最常被称为“难以穿透”的论文,因此,如果您是我,这不是我要查找的第一件事。

  • 那些递归方案(或更确切地说,是一种与这些递归方案的关系方法)的基本参考是Bird&de Moor的《编程代数》(该书除按需印刷外不可用,但有二手书可用)。 &应该在库中)。它包含了对无点编程(即使仍然是“学术性的”)的更详尽的详细解释:尽管以自成体系的方式,该书还是介绍了一些类别理论的词汇。但是,这些练习(您在论文中找不到)会有所帮助。

  • 排序态射由Lex Augustjein,用途排序上的各种数据结构的算法来解释递归方案。通过构造几乎是“虚拟人递归方案”:

    此演示文稿提供了以简单的方式介绍各种形态的机会,即作为在函数式编程中有用的递归模式,而不是通过类别理论的常用方法,这种方法对普通程序员而言往往是不必要的。

  • 以使无符号,呈现另一种方法是杰里米·吉本斯一章折纸编程编程的乐趣,与前一个有些重叠。它的参考书目对该主题进行了介绍。

    编辑:杰里米·吉本斯(Jeremy Gibbons)仅让我知道他在阅读了此问题后已在书的网页上添加了整本书书目的链接。享受吧!

恐怕这最后两个参考文献仅对(cata | ana | hylo | para)态素提供了扎实的解释,但我希望这足以打穿在更多使用符号表示的出版物中可以找到的代数形式主义。除了这四种以外,我不知道对(共)递归方案有任何严格的非范畴论解释。


16

蒂姆·威廉姆斯(Tim Williams)昨晚在伦敦Haskell用户组中就递归方案进行了精彩的演讲,并列举了您提到的每个方案。查看幻灯片:

http://www.timphilipwilliams.com/slides.html

在幻灯片的末尾提到了所有常见的可疑对象(镜头,香蕉,带刺的铁丝网等),您也可以在Google上搜索“ Origami Programming”,这是我以前从未见过的介绍。

视频将在上传后显示在此处:

http://www.youtube.com/user/LondonHaskell

编辑大多数有问题的链接都在huitseeker的回答中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.