73

我正在尋找一些非常簡單,易於掌握的遞歸方案和核心引力方案(變形,變形,水平變形等)的解釋,它們不需要大量的鏈接或打開類別理論教科書。我確信我已經在無意識中重塑了這些方案中的許多,並且在編碼過程中將它們「應用」在我的腦海中(我相信我們中的很多人都有),但我不知道(共)遞歸方案I使用被稱爲。 (好的,我撒謊了,我剛剛讀到了其中的一些,這引發了這個問題,但在今天之前,我沒有任何線索。)傻瓜的遞歸方案?

我認爲這些概念在編程社區中的擴散受到阻礙通過一些常見的解釋和例子,例如維基百科,還有其他地方。

這也可能被他們的名字所阻礙。我認爲還有一些其他的數學名稱(有關香蕉和鐵絲網的東西?),但我不知道我使用的遞歸方案的名稱是什麼。

我認爲這將有助於使用代表簡單現實世界問題的數據類型的示例,而不是像二叉樹這樣的抽象數據類型。

+5

傑里米吉本斯有幾篇論文可能是最好的介紹,因爲它們很清楚,很大程度上是自包含的。 「流式表示變換器」(摺疊和展開組合),「程序理解裂變」(paramorphisms等),「低估的展開」(變形)。 http://www.cs.ox.ac.uk/people/publications/date/Jeremy.Gibbons.html –

回答

37

非常鬆散地說,變形僅僅是fold的輕微泛化,而變形是unfold的輕微泛化。 (而且,一個hylomorphism只是一個展開,然後是一個摺疊。)。它們通常以更嚴格的形式呈現,以便與類別理論的聯繫更加清晰。更密集的形式讓我們區分數據(初始代數的必然有限乘積)和codata(最終餘代數的可能無窮乘積)。這種區別讓我們保證摺疊永遠不會在無限列表上被調用。變形和變形一般寫成的有趣方式的另一個原因是,通過對F-代數和F-代數(由仿函數生成)進行操作,我們可以一勞永逸地寫出它們,而不是一次在列表上,二叉樹等。這反過來有助於明確地確定爲什麼他們都是一樣的東西。

但是從純直覺的角度來看,你可以把cata和ana想象成減少和產生,就是這樣。

編輯:略偏

甲變質(長臂猿)就像是一個由內向外hylo - 其摺疊後跟一個展開。所以你可以用它來拆卸一個流,並建立一個具有不同結構的新流。

Ekmett貼一個很好的「野導」的各種方案在文獻中:http://comonad.com/reader/2009/recursion-schemes/

然而,儘管「直觀」的解釋很簡單,鏈接代碼是不夠使了,在一些博客文章這些可能會在複雜的/禁止的方面出現一些問題。

也就是說,除了組織形態學,我不認爲動物園的其他部分是你直接想要直接考慮的東西。如果你「得到」自己和元,那麼你可以單獨用它來表達幾乎任何東西。通常其他態射更具限制性,而不是更少(但因此給你更多的屬性「免費」)。

+1

好的,謝謝,但那只是那三個 - 還有其他的。我希望有人會添加一個關於其他遞歸方案的答案。 –

+3

大部分剩餘的遞歸方案都很模糊,除了可能是paramorphisms,它們很好地符合我們在依賴語言中經常看到的類型的「歸納原則」。我還沒有弄清楚所有的分類理論是如何在這裏發揮作用的,但我懷疑它會打破太可怕:) – copumpkin

+3

副形如同摺疊,但你可以偷看「其餘的輸入」。摺疊僅在遍歷期間爲您提供基本訪問權限。 –

21

一些參考資料,從最類別的理論(但有關給予「疆域圖」,可以讓你避免「點擊很多鏈接」),以簡單的&更加自足:

  • 就「香蕉&鐵絲網」詞彙而言,這來自the original paper of Meijer, Fokkinga & Patterson(及其它作者的續集),它總的來說就像不太可愛的備選方案那樣符號重:「名字」(香蕉等)僅僅是它們所固定的結構的ascii記法的圖形外觀的捷徑。例如,變形(即褶皺)用(| _ |)表示,並且與圓括號看起來像「香蕉」,因此名稱。這是最常被稱爲「難以穿越」的論文,因此如果我是你,我不會首先查找這些論文。

  • 那些遞歸方案的基本參考(或者更準確地說,對於關係的方法對這些遞歸方案)是鳥&德穆爾的Algebra of Programming(書除外的打印需求不可用,但也有副本二手&它應該在圖書館)。它包含了一個更節奏的點免費編程的詳細解釋,如果仍然是「學術」的話:本書介紹了一些類別理論詞彙,但是以一種獨立的方式。然而,這些練習(你在紙上找不到)會有所幫助。

  • Sorting morphisms by Lex Augustjein,使用各種數據結構上的排序算法來解釋遞歸方案。這是非常「傻瓜遞歸方案」,由建設:

    此演示文稿提供了機會,介紹各態射中 一個簡單的方法,即作爲在函數式編程有用遞歸的方式,而不是通過類別理論的常用方法,這對普通程序員來說往往是不必要的威脅。

  • 另一種方法,使一個自由的符號,呈現在The Fun of ProgrammingJeremy Gibbons' chapter Origami Programming,與前一個有些重疊。其參考書目介紹了該主題的介紹。

    編輯:Jeremy Gibbons只是讓我知道他已經在看完這個問題後在book's webpage上添加了一本關於整本書參考書目的鏈接。 享受

恐怕最後兩個引用只給了堅實的解釋(CATA | ANA | hylo |段)同態,但我的希望是,這將是足夠的通過代數形式主義,你可以找到撕在更多符號化的出版物中。我不知道除這四個以外的(共)遞歸方案的任何嚴格的非範疇論解釋。

15

蒂姆威廉姆斯昨晚在倫敦哈斯克爾用戶組發表了一個關於遞歸計劃的精彩演講,並提供了您提到的每個人的激勵示例。退房的幻燈片:

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

有在幻燈片的結束所有通常的嫌疑人(鏡頭,香蕉,鐵絲網點菜等)的引用,你也可以谷歌「摺紙編程」,這是一個很好的介紹,我以前沒有遇到過。

當它的上傳視頻將在這裏:

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

編輯大部分有問題的鏈接都在上面huitseeker的回答。

+1

太棒了,謝謝(Tim)! – glaebhoerl