Hiểu tại sao Zipper là Comonad


112

Đây là phần tiếp theo cho câu trả lời cho câu hỏi trước của tôi.

Giả sử tôi cần ánh xạ từng mục a:Acủa List[A]đến b:Bvới hàm def f(a:A, leftNeighbors:List[A]): Bvà tạo List[B].

Rõ ràng là tôi không thể chỉ gọi maptrên danh sách mà tôi có thể sử dụng khóa kéo danh sách . Khóa kéo là một con trỏ để di chuyển xung quanh danh sách. Nó cung cấp quyền truy cập vào phần tử hiện tại ( focus) và các phần tử lân cận của nó.

Bây giờ tôi có thể thay thế my fbằng def f'(z:Zipper[A]):B = f(z.focus, z.left)và chuyển hàm mới này f'sang cobindphương thức của Zipper[A].

Các cobindhoạt động như thế này: nó gọi như vậy f'với dây kéo, sau đó di chuyển dây kéo, gọi f'với dây kéo mới "đã di chuyển", di chuyển dây kéo một lần nữa, vân vân ... cho đến khi dây kéo đến cuối danh sách.

Cuối cùng, cobindtrả về một loại khóa kéo mới Zipper[B], có thể được chuyển đổi thành danh sách và do đó vấn đề được giải quyết.

Bây giờ hãy lưu ý sự đối xứng giữa cobind[A](f:Zipper[A] => B):Zipper[B]bind[A](f:A => List[B]):List[B]Đó là lý do tại sao Lista MonadZipperlà a Comonad.

Nó có ý nghĩa không?


1
Tôi không phải là một chuyên gia, nhưng điều đó có ý nghĩa với tôi. Tôi đã có một sự hiển linh khi đọc lời giải thích của bạn. Cảm ơn!
acjay

7
Câu hỏi của bạn rất khó trả lời ở định dạng SO ... nhưng bạn hoàn toàn chính xác. Các khóa kéo tập trung vào yếu tố luôn là điểm cộng.
J. Abrahamson

4
Danh sách cũng có thể được xem như một tổ hợp (theo nhiều cách), trong khi Zipper có thể được sử dụng như một đơn nguyên (cũng theo nhiều cách). Sự khác biệt nằm ở việc bạn tập trung vào khái niệm "nối" dữ liệu một cách xây dựng vào một máy trạng thái (đó là giao diện Monad nói về) hay "trích xuất" trạng thái từ nó "giải cấu trúc" (đó là những gì Comonad làm). Tuy nhiên, không dễ để trả lời câu hỏi được nêu là "sự hiểu biết này có ý nghĩa không". Theo một nghĩa nào đó thì nó có, theo một nghĩa khác thì không.
KT.

2
Để truyền một thứ gì đó vào một comonad, bạn cần cung cấp hai thao tác: 1) Trích xuất một giá trị (ví dụ: nó có thể là phần đầu của danh sách) và 2) Ứng dụng của một thao tác xử lý danh sách (ví dụ: bạn có thể áp dụng nó trong một trượt- cách cửa sổ dọc theo danh sách hoặc theo cách khôn ngoan hoặc tương tự, giả sử một phép biến đổi đơn vị thích hợp sẽ không thay đổi danh sách). Liệu cách xử lý danh sách như vậy có hợp lý hay không là một vấn đề riêng. Lưu ý rằng giao diện comonad trần không cung cấp cách nào để tạo danh sách cũng như duyệt qua nó. Nó chỉ biết cách sử dụng các hoạt động nhận biết danh sách.
KT.

2
@eenblam Bạn nói đúng. Tôi sẽ thêm một câu trả lời và nó sẽ đưa câu hỏi này ra khỏi danh sách chưa được trả lời, tôi hy vọng
Michael

Câu trả lời:


1

Vì câu hỏi này thường xuyên xuất hiện ở đầu danh sách "chưa được trả lời", hãy để tôi sao chép bình luận của tôi như một câu trả lời ở đây - dù sao thì không có gì mang tính xây dựng hơn đáng kể đã xuất hiện từ một năm trước.

A Listcũng có thể được xem như một đơn nguyên (theo nhiều cách), trong khi một Zippercó thể được coi như một đơn nguyên (cũng theo nhiều cách). Sự khác biệt là ở chỗ bạn tập trung vào khái niệm "nối" dữ liệu một cách xây dựng vào một máy trạng thái (đó là những gì về Monadgiao diện), hay "trích xuất" trạng thái từ nó "giải cấu trúc" (đó là những gì Comonadhiện).

Tuy nhiên, không dễ để trả lời câu hỏi được nêu là "sự hiểu biết này có ý nghĩa không". Theo một nghĩa nào đó thì nó có, theo một nghĩa khác thì không.

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.