86

我正在寻找一些非常简单、易于理解的递归方案和核心递归方案(catamorphisms、anamorphisms、hylomorphisms 等)的解释,这些解释不需要遵循大量链接或打开类别理论教科书。我确信我已经无意识地重新发明了许多这些方案,并在编码过程中将它们“应用”在我的脑海中(我相信我们中的许多人都有),但我不知道我的(共同)递归方案是什么使用被称为。(好吧,我撒了谎。我刚刚读到其中一些,这引发了这个问题。但在今天之前,我不知道。)

我认为这些概念在编程社区中的传播受到了人们往往会遇到的令人生畏的解释和示例的阻碍——例如在维基百科上,但也在其他地方。

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

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

4

3 回答 3

49

非常松散地说,变质只是 的轻微概括fold,变形是 的轻微概括unfold. (并且一个hylomorphism只是一个展开,然后是一个折叠。)。它们通常以更严格的形式呈现,以使与范畴论的联系更加清晰。更密集的形式让我们能够区分数据(初始代数的必然有限乘积)和余数据(最终代数的可能无限乘积)。这种区别让我们保证永远不会在无限列表上调用折叠。变态和变形通常以这种有趣的方式编写的另一个原因是,通过对 F 代数和 F 代数(由函子生成)进行操作,我们可以一劳永逸地编写它们,而不是在一个列表上写一次,一次在一个列表上写一次。二叉树等。这反过来又有助于弄清楚为什么它们都是一样的。

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

编辑:多一点

变质(长臂猿)就像一个由内而外的hylo——它是一个折叠,然后是一个展开。因此,您可以使用它来拆除流并建立一个具有可能不同结构的新流。

Ekmett 为文献中的各种方案发布了一个很好的“现场指南”:http: //comonad.com/reader/2009/recursion-schemes/

然而,虽然“直观”的解释很简单,但链接的代码就不那么简单了,其中一些的博客文章可能有点复杂/令人生畏。

也就是说,除了可能的组织形态之外,我认为动物园的其余部分不一定是你大部分时间想要直接思考的东西。如果你“得到”了 hylo 和 meta,你几乎可以单独用它们来表达任何东西。通常,其他态射更具限制性,而不是更少(但因此“免费”为您提供更多属性)。

于 2011-08-04T15:06:23.993 回答
23

一些参考资料,从最理论上的类别(但与提供“领土地图”相关,可以让您避免“点击大量链接”)到更简单和更独立的:

  • 就“香蕉和铁丝网”词汇而言,这来自Meijer、Fokkinga 和 Patterson 的原始论文(以及其他作者的续集),总而言之,它与不太可爱的替代品一样重符号: “名称”(香蕉等)只是它们所挂钩的结构的 ascii 符号的图形外观的快捷方式。例如,变态(即折叠)用 表示(| _ |),括号中的 par 看起来像“香蕉”,因此得名。这是最常被称为“坚不可摧”的论文,因此如果我是你,这不是我会查找的第一件事。

  • 这些递归方案的基本参考资料(或者更准确地说,这些递归方案的关系方法)是 Bird & de Moor 的《编程代数》(除了按需印刷外,该书不可用,但有二手可用的副本&它应该在图书馆)。它包含对无点编程的更节奏和详细的解释,如果仍然是“学术的”:这本书介绍了一些类别理论词汇,尽管是以自包含的方式。然而,练习(你不会在论文中找到)会有所帮助。

  • Lex Augustjein 的排序态射,在各种数据结构上使用排序算法来解释递归方案。通过构造,它几乎是“傻瓜递归方案”:

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

  • 另一种进行无符号演示的方法是Jeremy GibbonsThe Fun of Programming中的Origami Programming一章,与前一章有一些重叠。它的参考书目提供了对该主题的介绍。

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

恐怕这最后两个参考文献仅对 (cata|ana|hylo|para)morphisms 给出了可靠的解释,但我希望这足以打破您在更多符号密集型出版物中可以找到的代数形式主义。除了这四种之外,我不知道(共)递归方案的任何严格的非分类理论解释。

于 2011-08-05T23:28:32.830 回答
17

Tim Williams 昨晚在 London Haskell 用户组上就递归方案做了一场精彩的演讲,并为你提到的每一个提供了一个激励性的例子。查看幻灯片:

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

幻灯片末尾有对所有常见嫌疑人(镜头、香蕉、带刺铁丝网点菜等)的引用,您还可以在 Google 上搜索“Origami Programming”,这是一个不错的介绍,我以前没有遇到过。

视频上传后会出现在这里:

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

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

于 2013-03-28T16:56:17.813 回答