더미를위한 재귀 체계?


83

나는 많은 링크를 따르거나 범주 이론 교과서를 열 필요가없는 재귀 체계와 코어 커션 체계 (이화, 아나 모피 즘, 히로 모피 즘 등)에 대한 정말 간단하고 이해하기 쉬운 설명을 찾고 있습니다. 나는 이러한 체계를 무의식적으로 재창조하고 코딩 과정에서 내 머릿속에 "적용"했다고 확신합니다 (많은 사람들이 알고 있음을 확신합니다). 사용이 호출됩니다. (좋아요, 거짓말을했습니다. 방금 몇 가지에 대해 읽었 기 때문에이 질문이 나타났습니다.하지만 오늘 전에는 단서가 없었습니다.)

프로그래밍 커뮤니티 내에서 이러한 개념의 확산이 금지 된 설명과 예를 들어 위키피디아와 같은 다른 곳에서 접하는 경향이 있다고 생각합니다.

아마도 그들의 이름으로 인해 방해를 받았을 것입니다. 나는 대체적이고 덜 수학적인 이름이 있다고 생각하지만 (바나나와 철조망에 관한 것입니까?)하지만 내가 사용하는 재귀 체계에 대해 더 귀여운 이름이 무엇인지 전혀 모릅니다.

이진 트리와 같은 추상적 인 데이터 유형보다는 단순한 실제 문제를 나타내는 데이터 유형으로 예제를 사용하는 것이 도움이 될 것이라고 생각합니다.


6
Jeremy Gibbons는 명확하고 대부분 자체적으로 포함되어 있기 때문에 최상의 소개가 될 수있는 여러 논문을 보유하고 있습니다. "스트리밍 표현 체인저"(폴드 및 펼침 결합), "프로그램 이해를위한 핵분열"(파라 모피 즘 등), "저평가 된 전개"(애너 모피 즘). cs.ox.ac.uk/people/publications/date/Jeremy.Gibbons.html
stephen tetley 2011 년

답변:


44

매우 느슨하게 말하면 catamorphism은의 약간 일반 화일 뿐이고 foldanamorphism은 약간의 일반화입니다.unfold. (그리고 hylomorphism은 펼친 다음 접힌 것입니다.). 일반적으로 범주 이론과의 연결을 더 명확하게하기 위해보다 엄격한 형식으로 제공됩니다. 더 조밀 한 형태는 데이터 (초기 대수의 유한 한 곱)와 codata (마지막 합 물의 무한한 곱)를 구별 할 수있게합니다. 이러한 구분을 통해 무한 목록에서 접기가 호출되지 않음을 보장 할 수 있습니다. catamorphisms 및 anamorphisms가 일반적으로 작성되는 재미있는 방법에 대한 또 다른 이유는 F-algebras 및 F-coalgebras (펑터에서 생성됨)에 대해 작동하여 목록에 한 번이 아닌 한 번에 한 번만 쓸 수 있다는 것입니다. 이진 트리 등이 있습니다. 이것은 차례로 그들이 모두 같은 이유 를 정확히 명확히하는 데 도움이됩니다 .

그러나 순수한 직관의 관점에서 보면 카타와 아나는 감소하고 생산하는 것으로 생각할 수 있습니다.

편집 : 조금 더

변신 (Gibbons)은 인사이드 아웃 하이로와 같습니다. 따라서이를 사용하여 스트림을 분해하고 잠재적으로 다른 구조로 새 스트림을 구축 할 수 있습니다.

Ekmett는 문헌의 다양한 계획에 대한 멋진 "필드 가이드"를 게시했습니다. http://comonad.com/reader/2009/recursion-schemes/

그러나 "직관적 인"설명은 간단하지만 링크 된 코드는 그다지 적으며 이들 중 일부에 대한 블로그 게시물은 복잡하고 금지적인 측면에 약간있을 수 있습니다.

즉, 아마도 조직 형태를 제외하고는 나머지 동물원이 반드시 대부분의 시간 동안 직접적으로 생각하고 싶은 것이라고 생각하지 않습니다. hylo와 meta를 "얻으면"거의 모든 것을 표현할 수 있습니다. 일반적으로 다른 형태는 더 제한적이며 덜 제한적입니다 (그러나 "무료"로 더 많은 속성을 제공합니다).


1
좋아요, 고마워요.하지만 그건 그 세 가지입니다. 다른 것들이 있습니다. 누군가가 다른 재귀 체계에 대한 답변을 추가하기를 바랍니다.
Robin Green

3
나머지 재귀 체계의 대부분은 우리가 종속 언어에서 흔히 볼 수있는 유형의 "유도 원리"에 아주 잘 일치하는 패러 모피 즘을 제외하고는 다소 모호합니다. 나는 모든 범주 이론이 여기서 어떻게 작동하는지 잘 알지 못했지만 너무 끔찍하게 깨질 것
같지 않습니다.

3
Paramorphism은 폴드와 같지만 "나머지 입력"을 엿볼 수 있습니다. 폴드는 순회 중 기본 액세스 만 제공합니다.
stephen tetley 2011 년

23

가장 범주 이론적 (그러나 "많은 링크 클릭"을 피할 수있는 "지역지도"를 제공하는 것과 관련이 있음)에서 더 간단하고 독립적 인 몇 가지 참고 문헌 :

  • "bananas & barbed wire"어휘에 관한 한, 이것은 Meijer, Fokkinga & Patterson (그리고 다른 저자들의 속편) 의 원본 논문에서 비롯된 것이며 , 덜 귀여운 대안만큼이나 표기법이 무겁습니다. "이름"(바나나 등)은 고정 된 구조의 ASCII 표기법의 그래픽 모양에 대한 지름길 일뿐입니다. 예를 들어, catamorphisms (예 : 폴드)는로 표시되고 (| _ |)par-with-parenthesis는 "바나나"처럼 보이므로 이름이됩니다. 이것은 가장 자주 "침투 할 수없는"이라고 불리는 논문입니다. 그러므로 제가 당신이라면 제가 가장 먼저 찾아 볼 것은 아닙니다.

  • 이러한 재귀 체계에 대한 기본 참조 (또는 더 정확하게는 이러한 재귀 체계에 대한 관계형 접근 방식)는 Bird & de Moor의 Algebra of Programming입니다 (본 책은 주문형 인쇄를 제외하고는 사용할 수 없지만 중고 사본이 있습니다. & 라이브러리에 있어야 함). 아직 "학술적"이라면 포인트없는 프로그래밍에 대해 좀 더 진행되고 자세한 설명이 포함되어 있습니다.이 책은 독립적 인 방식으로 일부 범주 이론 어휘를 소개합니다. 그러나 (논문에서는 찾을 수없는) 연습 문제가 도움이됩니다.

  • Lex Augustjein의 정렬 형태 는 다양한 데이터 구조에 대한 정렬 알고리즘을 사용하여 재귀 체계를 설명합니다. 구성 상 거의 " 인형을위한 재귀 체계 "입니다.

    이 프레젠테이션은 일반 프로그래머에게 불필요하게 위협적인 경향이있는 범주 이론을 통한 일반적인 접근 방식 대신 함수형 프로그래밍에 유용한 재귀 패턴으로 다양한 형태를 간단한 방식으로 소개 할 수있는 기회를 제공합니다.

  • 기호없는 프레젠테이션을 만드는 또 다른 접근 방식은 Jeremy Gibbons의 The Fun of Programming 챕터 Origami Programming 이며 , 일부는 이전 항목과 겹칩니다. 참고 문헌은 주제에 대한 소개를 제공합니다.

    편집 : Jeremy Gibbons 는 이 질문을 읽은 후 책의 웹 페이지 에있는 전체 책의 참고 문헌에 대한 링크를 추가했음을 알려주었습니다 . 즐기십시오 !

이 마지막 두 참고 문헌이 (cata | ana | hylo | para) 형태론에 대한 확실한 설명 만 제공하는 것이 두렵지 만 제 희망은 이것이 더 많은 표기법이 많은 출판물에서 찾을 수있는 대수 형식주의를 뜯어 내기에 충분하다는 것입니다. 나는이 네 가지 이외의 (공동) 재귀 체계에 대한 엄격한 비 범주 이론적 설명을 알지 못합니다.


16

Tim Williams는 지난 밤 London Haskell User Group에서 당신이 언급 한 각각의 동기를 부여하는 예와 함께 재귀 체계에 대해 훌륭한 강연을했습니다. 슬라이드를 확인하십시오.

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

슬라이드 끝에는 모든 일반적인 용의자 (렌즈, 바나나, 철조망 알라 카르 트 등)에 대한 언급이 있으며 이전에 보지 못했던 멋진 소개 인 "Origami Programming"을 Google에 검색 할 수도 있습니다.

동영상이 업로드되면 여기에 표시됩니다.

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

편집 문제의 대부분의 링크는 위의 huitseeker의 답변에 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.