Đề án đệ quy cho hình nộm?


83

Tôi đang tìm kiếm một số giải thích thực sự đơn giản, dễ hiểu về lược đồ đệ quy và lược đồ lõi (catamorphisms, anamorphisms, hylomorphisms, v.v.) mà không yêu cầu theo nhiều liên kết hoặc mở một sách giáo khoa lý thuyết danh mục. Tôi chắc chắn rằng tôi đã phát minh lại nhiều sơ đồ này một cách vô thức và "áp dụng" chúng trong đầu trong quá trình viết mã (tôi chắc rằng nhiều người trong chúng ta đều có), nhưng tôi không có manh mối gì về các lược đồ đệ quy (co) tôi. sử dụng được gọi. (Được rồi, tôi đã nói dối. Tôi vừa mới đọc về một vài người trong số họ, điều này đã dẫn đến câu hỏi này. Nhưng trước ngày hôm nay, tôi không có manh mối nào.)

Tôi nghĩ rằng sự phổ biến của những khái niệm này trong cộng đồng lập trình đã bị cản trở bởi những giải thích và ví dụ bị cấm mà người ta có xu hướng bắt gặp - ví dụ trên Wikipedia, nhưng cũng có thể ở những nơi khác.

Nó cũng có thể bị cản trở bởi tên của họ. Tôi nghĩ rằng có một số tên thay thế, ít toán học hơn (một cái gì đó về chuối và dây thép gai?) Nhưng tôi không biết những tên dễ thương hơn là gì cho các sơ đồ đệ quy mà tôi sử dụng.

Tôi nghĩ sẽ hữu ích nếu sử dụng các ví dụ với kiểu dữ liệu đại diện cho các vấn đề đơn giản trong thế giới thực, thay vì các kiểu dữ liệu trừu tượng như cây nhị phân.


6
Jeremy Gibbons có một số bài báo có thể là lời giới thiệu tốt nhất vì chúng rõ ràng và chủ yếu là khép kín. "Truyền trực tuyến các bộ thay đổi đại diện" (kết hợp gấp và mở ra), "Phân hạch để hiểu chương trình" (paramorphisms và hơn thế nữa), "The under đánh giá cao mở ra" (anamorphisms). cs.ox.ac.uk/people/publications/date/Jeremy.Gibbons.html
Stephen tetley

Câu trả lời:


44

Nói một cách vô cùng lỏng lẻo, catamorphism chỉ là một sự khái quát hóa nhỏ fold, và anamorphism là một sự khái quát hóa nhỏ vềunfold. (Và tính chất hylomorphism chỉ là một nếp gấp mở ra theo sau là một nếp gấp.). Chúng thường được trình bày ở dạng chặt chẽ hơn, để làm cho mối liên hệ với lý thuyết phạm trù rõ ràng hơn. Dạng đặc hơn cho phép chúng ta phân biệt dữ liệu (tích nhất thiết hữu hạn của đại số ban đầu) và codata (tích có thể là vô hạn của đại số hợp nhất). Sự khác biệt này cho phép chúng tôi đảm bảo rằng một nếp gấp không bao giờ được gọi trong danh sách vô hạn. Một lý do khác giải thích cách hài hước mà catamorphisms và anamorphisms thường được viết là bằng cách vận hành trên đại số F và đại số F (được tạo ra từ các hàm số), chúng ta có thể viết chúng một lần và mãi mãi, thay vì một lần trên danh sách, một lần cây nhị phân, v.v. Điều này giúp làm rõ chính xác lý do tại sao chúng đều giống nhau.

Nhưng từ quan điểm trực giác thuần túy, bạn có thể nghĩ rằng cata và ana là giảm và tạo ra, và đó là về nó.

Chỉnh sửa: một chút nữa

Sự biến chất (Vượn) giống như một lời quảng cáo từ trong ra ngoài - một nếp gấp tiếp theo là một nếp gấp mở ra. Vì vậy, bạn có thể sử dụng nó để chia nhỏ luồng và xây dựng luồng mới với cấu trúc có thể khác.

Ekmett đã đăng một "hướng dẫn thực địa" rất hay về các sơ đồ khác nhau trong tài liệu: http://comonad.com/reader/2009/recursion-schemes/

Tuy nhiên, trong khi các giải thích "trực quan" rất đơn giản, thì mã liên kết ít như vậy hơn, và các bài đăng trên blog về một số trong số này có thể hơi phức tạp / cấm.

Điều đó nói rằng, có lẽ ngoại trừ các biểu đồ, tôi không nghĩ phần còn lại của vườn thú nhất thiết phải là thứ mà bạn muốn nghĩ trực tiếp hầu hết thời gian. Nếu bạn "nhận được" hylo và meta, bạn có thể thể hiện hầu hết mọi thứ về chúng một mình. Thông thường, các hình thái khác bị hạn chế hơn, không phải ít hơn (nhưng do đó cung cấp cho bạn nhiều thuộc tính hơn "miễn phí").


1
Được rồi, cảm ơn, nhưng đó chỉ là ba cái đó thôi - còn những cái khác. Tôi hy vọng rằng ai đó sẽ thêm câu trả lời về một số lược đồ đệ quy khác.
Robin Green

3
Hầu hết các lược đồ đệ quy còn lại là loại tối nghĩa, ngoại trừ có thể là các biến hình, tương ứng khá tốt với "nguyên tắc quy nạp" cho các kiểu mà chúng ta thường thấy trong các ngôn ngữ phụ thuộc. Tôi đã không hoàn toàn tìm ra cách tất cả các lý thuyết danh mục hoạt động ra ở đây, nhưng tôi nghi ngờ nó sẽ phá vỡ quá khủng khiếp :)
copumpkin

3
Paramorphism giống như một nếp gấp nhưng bạn có thể xem qua "phần còn lại của đầu vào". Màn hình đầu tiên chỉ cung cấp cho bạn quyền truy cập sơ cấp trong quá trình truyền tải.
Stephen tetley

23

Một vài tài liệu tham khảo, từ lý thuyết danh mục nhất (nhưng có liên quan để đưa ra "bản đồ lãnh thổ" sẽ cho phép bạn tránh "nhấp vào nhiều liên kết") đến đơn giản và khép kín hơn:

  • Theo như từ vựng "chuối & dây thép gai", điều này xuất phát từ bài báo gốc của Meijer, Fokkinga & Patterson (và phần tiếp theo của nó của các tác giả khác), và tổng thể nó cũng nặng ký hiệu như các lựa chọn thay thế kém dễ thương hơn: "tên" (chuối, v.v.) chỉ là một lối tắt cho hình thức đồ họa của ký hiệu ascii của các cấu trúc mà chúng được gắn vào. Ví dụ, các catamorphisms (tức là các nếp gấp) được biểu diễn bằng (| _ |), và dấu ngoặc đơn trông giống như một "quả chuối", do đó có tên. Đây là tờ báo thường được gọi là "không thể xuyên thủng", do đó không phải là điều đầu tiên tôi tìm kiếm nếu tôi là bạn.

  • Tài liệu tham khảo cơ bản cho các lược đồ đệ quy đó (hoặc chính xác hơn, cho một cách tiếp cận quan hệ với các lược đồ đệ quy đó) là Đại số lập trình của Bird & de Moor (cuốn sách không có sẵn ngoại trừ bản in theo yêu cầu, nhưng có sẵn các bản sao & nó phải có trong thư viện). Cuốn sách có giải thích chi tiết và nhịp độ hơn về lập trình không điểm, nếu vẫn còn "hàn lâm": cuốn sách giới thiệu một số từ vựng thuộc phạm trù lý thuyết, mặc dù theo một cách riêng. Tuy nhiên, các bài tập (mà bạn sẽ không tìm thấy trong báo) sẽ giúp ích.

  • Sắp xếp các hình thái của Lex Augustjein , sử dụng các thuật toán sắp xếp trên các cấu trúc dữ liệu khác nhau để giải thích các lược đồ đệ quy. Đó là khá nhiều " lược đồ đệ quy cho hình nộm " bằng cách xây dựng:

    Phần trình bày này mang đến cơ hội giới thiệu các dạng biến đổi khác nhau một cách đơn giản, cụ thể là các mẫu đệ quy hữu ích trong lập trình hàm, thay vì cách tiếp cận thông thường thông qua lý thuyết phạm trù, có xu hướng không cần thiết đối với các lập trình viên bình thường.

  • Một cách tiếp cận khác để tạo một bản trình bày không có ký hiệu là chương Lập trình Origami trong The Fun of Programming của Jeremy Gibbons , với một số điểm trùng lặp với chương trước. Thư mục của nó cung cấp một chuyến tham quan các phần giới thiệu về chủ đề.

    Chỉnh sửa: Jeremy Gibbons chỉ cho tôi biết anh ấy đã thêm một liên kết đến thư mục của toàn bộ cuốn sách trên trang web của cuốn sách sau khi đọc câu hỏi này. Hãy tận hưởng !

Tôi e rằng hai tài liệu tham khảo cuối cùng này chỉ đưa ra lời giải thích chắc chắn về các hình thái (cata | ana | hylo | para), nhưng hy vọng của tôi là điều này sẽ đủ để phá vỡ chủ nghĩa hình thức đại số mà bạn có thể tìm thấy trong các ấn phẩm nặng ký hiệu hơn. Tôi không biết bất kỳ lời giải thích lý thuyết không thuộc phạm trù nghiêm ngặt nào về các lược đồ đệ quy (co-) ngoài bốn sơ đồ đó.


16

Tim Williams đã có một buổi nói chuyện tuyệt vời tại Nhóm người dùng Haskell ở London vào đêm qua về các sơ đồ đệ quy với một ví dụ thúc đẩy về mỗi sơ đồ mà bạn đề cập. Kiểm tra các trang trình bày:

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

Có các tham chiếu đến tất cả các vật nghi thông thường (ống kính, chuối, dây thép gai ala carte, v.v.) ở cuối các trang trình bày và bạn cũng có thể google "Lập trình Origami", đây là phần giới thiệu thú vị mà tôi chưa xem qua trước đây.

và video sẽ ở đây khi được tải lên:

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

chỉnh sửa Hầu hết các liên kết được đề cập đều nằm trong câu trả lời của huitseeker ở trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.