我正在寻找一些非常简单,易于掌握的递归方案和核心运动方案(catamorphisms,anorporphisms,hylomorphisms等)的解释,这些解释不需要大量的链接,或者打开类别理论教科书。我确信我已经无意识地重新设计了许多这些方案,并在编码过程中将它们“应用”在我的头脑中(我相信我们很多人都有),但我不知道(共同)递归方案我是什么使用被称为。 (好吧,我说谎了。我刚刚读了一些这些,这引发了这个问题。但在今天之前,我一无所知。)
我认为这些概念在编程社区中的传播受到了令人生畏的解释和例子的阻碍 - 例如在维基百科上,而且在其他地方。
它们的名字也可能受到阻碍。我认为有一些替代的,较少的数学名称(关于香蕉和带刺铁丝网的东西?)但我不知道我使用的递归方案的名称是什么。
我认为使用表示简单现实问题的数据类型的示例会有所帮助,而不是抽象数据类型(如二叉树)。
答案 0 :(得分:42)
非常松散地说,一个变形现象只是fold
的一个小概括,而一个变形现象是unfold
的略微概括。 (并且一个hylomorphism只是一个展开,然后是折叠。)。它们通常以更严格的形式呈现,以使与类别理论的联系更加清晰。更密集的形式使我们能够区分数据(初始代数的必然有限乘积)和codata(最终余代数的可能无限乘积)。这种区别让我们保证永远不会在无限列表中调用折叠。通常编写catamorphisms和anamorphisms的有趣方式的另一个原因是,通过操作F-algebras和F-coalgebras(从仿函数生成),我们可以一劳永逸地写出它们,而不是一次在列表上,二元树等。这反过来有助于明确为什么它们都是一样的。
但是从纯粹的直觉角度来看,你可以把cata和ana想象为减少和产生,而这就是它。
编辑:多一点
变形现象(Gibbons)就像一个由里而外的hylo - 它是一个折叠,然后展开。因此,您可以使用它来拆除流并构建一个具有可能不同结构的新流。Ekmett为文献中的各种方案发布了一个很好的“实地指南”:http://comonad.com/reader/2009/recursion-schemes/
然而,虽然“直观”的解释很简单,但链接的代码却不那么简单,其中一些的博客文章可能在复杂/令人生畏的方面有点不足。
那就是说,除了组织形态学之外我不认为动物园的其他部分一定是大多数时候你想要直接思考的东西。如果你“得到”hylo和meta,你几乎可以用它们来表达任何东西。通常情况下,其他态射更具限制性,而不是更少(但因此“免费”为您提供更多属性)。
答案 1 :(得分:23)
一些参考文献,从最类别理论(但相关的给出“领土地图”,可以让你避免“点击大量的链接”)到更简单的&更独立:
就“香蕉和铁丝网”的词汇来说,这来自the original paper of Meijer, Fokkinga & Patterson(以及其他作者的续集),总而言之,就像可爱的选择:“名称”(香蕉等)只是它们被挂钩的结构的ascii表示法的图形外观的快捷方式。例如,catamorphisms(即folds)用(| _ |)
表示,par-with-括号看起来像“香蕉”,因此得名。这篇论文最常被称为“难以理解”,因此,如果我是你,那么我不会第一眼看到它。
这些递归方案的基本参考(或更确切地说,对于那些递归方案的关系方法)是Bird& de Moor的Algebra of Programming(除了作为打印要求之外,这本书是不可用的,但是有二手副本和它应该在图书馆中)。它包含一个更节奏的&无点编程的详细解释,如果仍然是“学术性的”:本书介绍了一些类别理论词汇,尽管是自成一体的。然而,练习(你在纸上找不到)有帮助。
Sorting morphisms by Lex Augustjein,在各种数据结构上使用排序算法来解释递归方案。通过构造它几乎是“傻瓜的递归方案”:
此演示文稿提供了介绍各种态射的机会 一种简单的方法,即作为函数式编程中有用的递归模式,而不是通过类别理论的通常方法,这对于普通程序员来说往往是不必要的恐吓。
制作无符号演示文稿的另一种方法是Jeremy Gibbons' chapter Origami Programming The Fun of Programming,与前一个有一些重叠。其参考书目介绍了该主题的介绍。
编辑:Jeremy Gibbons只是让我知道他在阅读完这个问题之后在book's webpage上添加了整本书目目录的链接。 享受!
我担心这最后两篇参考文献只能给出(cata | ana | hylo | para)态射的可靠解释,但我希望这足以撕掉你可以在更多符号中找到的代数形式主义 - 重型出版物。我不知道除了那四个之外的(共)递归方案的任何严格的非类别理论解释。
答案 2 :(得分:16)
http://www.timphilipwilliams.com/slides.html
在幻灯片的末尾有所有常见的嫌疑人(镜头,香蕉,带刺铁丝网等),你也可以谷歌“折纸编程”,这是一个很好的介绍,我以前没见过
,视频将在上传时显示:
http://www.youtube.com/user/LondonHaskell
编辑大多数相关链接都在上面的huitseeker答案中。