Câu hỏi Đề án đệ quy cho núm vú giả?


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

Tôi nghĩ rằng sự phổ biến của các khái niệm này trong cộng đồng lập trình đã bị cản trở bởi các giải thích và ví dụ cấm có xu hướng đi qua - ví dụ trên Wikipedia, nhưng cũ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ố thay thế, ít tên toán học (một cái gì đó về chuối và dây thép gai?) Nhưng tôi không có đầu mối những gì các tên cắt xén được cho các chương trình đệ quy mà tôi sử dụng, một trong hai.

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


76
2017-08-04 13:03


gốc


Jeremy Gibbons có một số giấy tờ có thể là phần giới thiệu tốt nhất vì chúng rõ ràng và phần lớn tự chứa. "Thay đổi đại diện truyền trực tuyến" (gấp và mở ra kết hợp), "Phân hạch cho hiểu biết chương trình" (paramorphisms và nhiều hơn nữa), "The under appreciated unfold" (anamorphisms). cs.ox.ac.uk/people/publications/date/Jeremy.Gibbons.html - stephen tetley


Các câu trả lời:


Nói một cách lỏng lẻo, một sự biến hình chỉ là một sự tổng quát nhẹ của foldvà một biến chất là một sự tổng quát nhẹ của unfold. (Và một hylomorphism chỉ là một mở ra theo sau là một lần.). Chúng thường được trình bày dưới dạng nghiêm ngặt hơn, để làm cho kết nối với lý thuyết thể loại rõ ràng hơn. Dạng đặc hơn cho phép chúng ta phân biệt dữ liệu (sản phẩm hữu hạn nhất thiết của đại số ban đầu) và codata (sản phẩm có thể vô hạn của một đại số cuối cùng). 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 cho cách hài hước mà sự biến hình và anamorphisms thường được viết là bằng thao tác trên F-algebras và F-coalgebras (được tạo ra từ functors) chúng ta có thể viết chúng một lần và cho tất cả, thay vì một lần trong danh sách, cây nhị phân, v.v. Điều này sẽ giúp làm rõ chính xác tại sao tất cả đều giống nhau.

Nhưng từ quan điểm trực giác thuần khiết, bạn có thể nghĩ về cata và ana như giảm và sản xuất, và đó là về nó.

Chỉnh sửa: thêm một chút

Một biến chất (Gibbons) giống như một hylo bên trong - một nếp gấp của nó theo sau là một mở ra. Vì vậy, bạn có thể sử dụng nó để rách xuống một dòng và xây dựng một cái mới với một cấu trúc có khả năng khác nhau.

Ekmett đăng một "hướng dẫn thực địa" tốt đẹp cho các đề án khác nhau trong văn học: 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, mã được liên kết ít hơn và các bài đăng trên blog trên một số trong số này có thể là một chút về phía phức tạp / cấm.

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


39
2017-08-04 15:06



OK, cảm ơn, nhưng đó chỉ là ba - có những người khác. Tôi hy vọng rằng ai đó sẽ thêm một câu trả lời về một số chương trình đệ quy khác. - Robin Green
Hầu hết các đề án đệ quy còn lại là loại tối nghĩa, ngoại trừ có thể là các đa hình, tương ứng khá độc đáo với các "nguyên tắc cảm ứng" 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 thể loại hoạt động ở đây, nhưng tôi nghi ngờ nó sẽ phá vỡ quá khủng khiếp :) - copumpkin
Paramorphism giống như một lần nhưng bạn có thể nhìn vào "phần còn lại của đầu vào". Lần hiển thị chỉ cung cấp cho bạn quyền truy cập cơ bản trong quá trình truyền tải. - stephen tetley


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

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

  • Tham chiếu cơ bản cho các lược đồ đệ quy đó (hay chính xác hơn, cho một cách tiếp cận quan hệ với các chương trình đệ quy) là của Bird & de Moor Đại số lập trình (sách không khả dụng ngoại trừ yêu cầu in theo yêu cầu, nhưng có sẵn các bản sao cũ và sẽ có trong thư viện). Nó chứa một lời giải thích chi tiết và chi tiết hơn về lập trình điểm-miễn phí, nếu vẫn còn "học thuật": cuốn sách giới thiệu một số từ vựng lý thuyết thể loại, mặc dù theo cách khép kín. Tuy nhiên, các bài tập (mà bạn sẽ không tìm thấy trong một bài báo) giúp đỡ.

  • Phân loại hình thái bởi 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. Nó là khá nhiều "kế hoạch đệ quy cho núm vú giả"bằng cách xây dựng:

    Bài thuyết trình này tạo cơ hội để giới thiệu các hình thái khác nhau trong   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 danh mục, có xu hướng không cần thiết đe dọa cho lập trình viên trung bình.

  • Một cách tiếp cận khác để tạo bản trình bày không có biểu tượng là Chương Jeremy Gibbons Lập trình Origami trong Niềm vui của lập trình, với một số trùng lặp với trước đó. Thư mục của nó cho một chuyến tham quan giới thiệu về chủ đề này.

    Chỉnh sửa : Jeremy Gibbons chỉ cần cho tôi biết anh ấy đã thêm một liên kết vào 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. Thưởng thức !

Tôi sợ hai tài liệu tham khảo cuối cùng chỉ đưa ra một giải thích rõ ràng về các hình thái (cata | ana | hylo | para), nhưng hy vọng của tôi là đủ để xé qua hình thức đại số mà bạn có thể tìm thấy trong nhiều ấn phẩm nặng ký hiệu. Tôi không biết bất kỳ lời giải thích lý thuyết không thuộc loại nào của các chương trình đệ quy (cùng) khác với bốn chương trình đó.


22
2017-08-05 23:28





Tim Williams đã có một buổi nói chuyện tuyệt vời tại Nhóm người dùng London Haskell đêm qua về các chương trình đệ quy với một ví dụ thúc đẩy của từng đề xuất bạn đề cập đến. Xem các trang trình bày:

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

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

và video sẽ ở đây khi video đượ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.


15
2018-03-28 16:56



Thật tuyệt vời, cảm ơn bạn (và Tim)! - glaebhoerl