Haskell 假人的递归方案?

Haskell 假人的递归方案?,haskell,recursion,functional-programming,recursion-schemes,Haskell,Recursion,Functional Programming,Recursion Schemes,我正在寻找一些非常简单、易于掌握的递归模式和共递归模式(反同构、反同构、hylomorphism等)的解释,它们不需要遵循很多链接,也不需要打开一本范畴论教科书。我确信我在无意识中重新发明了许多这样的方案,并在编码过程中“应用”了它们(我确信我们中的许多人都有),但我不知道我使用的(协同)递归方案叫什么。(好吧,我撒了谎。我刚刚读了一些关于他们的文章,这引发了这个问题。但在今天之前,我没有任何线索。) 我认为这些概念在编程社区中的传播受到了人们经常遇到的令人生畏的解释和例子的阻碍——例如在维基百

我正在寻找一些非常简单、易于掌握的递归模式和共递归模式(反同构、反同构、hylomorphism等)的解释,它们不需要遵循很多链接,也不需要打开一本范畴论教科书。我确信我在无意识中重新发明了许多这样的方案,并在编码过程中“应用”了它们(我确信我们中的许多人都有),但我不知道我使用的(协同)递归方案叫什么。(好吧,我撒了谎。我刚刚读了一些关于他们的文章,这引发了这个问题。但在今天之前,我没有任何线索。)

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

这也可能是因为他们的名字。我认为有一些可供选择的、数学性较低的名称(关于香蕉和带刺铁丝网?),但我也不知道我使用的递归方案的cutsier名称是什么


我认为使用代表简单现实世界问题的数据类型的示例,而不是像二叉树这样的抽象数据类型,会有所帮助。

非常宽松地说,一个反同构只是
折叠的一个轻微推广,一个反同构是
展开的一个轻微推广。(hylomorphism只是一个展开,然后是一个褶皱。)。它们通常以更严格的形式呈现,以使与范畴理论的联系更加清晰。更密集的形式使我们能够区分数据(初始代数的必然有限积)和codata(最终余代数的可能无限积)。这种区别让我们可以保证,在无限列表中永远不会调用折叠。另一个有趣的原因是,通过对F-代数和F-余代数(由函子生成)进行操作,我们可以一次性地编写它们,而不是在列表上编写一次,在二叉树上编写一次等等。这反过来有助于明确为什么它们都是一样的

但从纯直觉的角度来看,你可以把cata和ana看作是减少和产生的,仅此而已

编辑:再多一点

变质作用(长臂猿)就像一个由内而外的海洛——它是一个褶皱,然后是一个展开。因此,您可以使用它来分解一个流,并建立一个具有潜在不同结构的新流

Ekmett为文献中的各种方案发布了一份不错的“现场指南”:

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


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

一些参考资料,从最基本的类别理论(但与提供一个可以避免“点击大量链接”的“领域图”相关)到更简单、更独立的:

  • 就“香蕉和带刺铁丝网”词汇而言,这一词汇来源于(以及其他作者的续集),总之,它与不太可爱的替代词一样重:名称(香蕉等)只是它们所绑定的结构的ascii符号图形化外观的捷径。例如,变形(即褶皱)用
    (| | |)
    表示,带有括号的par看起来像“香蕉”,因此得名。这是一份最常被称为“不可穿透”的报纸,因此如果我是你,我不会首先查阅它

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

  • ,使用各种数据结构上的排序算法来解释递归方案。通过构造,它几乎是“假人的递归方案”:

    本演示提供了一个机会来介绍中的各种态射 一种简单的方法,即在函数式编程中有用的递归模式,而不是通常通过范畴论的方法,这对普通程序员来说是不必要的威胁

  • 另一种无符号表示的方法是,与前一种方法有些重叠。它的参考书目提供了对该主题的介绍

    编辑:请告诉我,他在阅读完这个问题后,添加了一个到整本书的参考书目的链接享受


我担心最后两篇参考文献只能对(cata | ana | hylo | para)态射给出一个可靠的解释,但我希望这将足以撕裂代数形式主义,你可以在更多符号密集的出版物中找到。除了这四种递归方案之外,我不知道有任何严格的非范畴理论解释。

蒂姆·威廉姆斯(Tim Williams)昨晚在伦敦哈斯克尔用户小组(London Haskell User Group)上就递归方案进行了精彩的演讲,并给出了您提到的每种方案的激励示例。请查看幻灯片:

在幻灯片的末尾,有对所有常见嫌疑犯的引用(镜头、香蕉、铁丝网等),你也可以在谷歌上搜索“折纸编程”,这是一个很好的介绍