ทำความเข้าใจว่าทำไม Zipper ถึงเป็น Comonad


112

นี่คือการติดตามคำตอบสำหรับคำถามก่อนหน้าของฉัน

สมมติว่าฉันต้อง map แต่ละรายการa:AของList[A]ที่จะb:Bมีฟังก์ชั่นและสร้างdef f(a:A, leftNeighbors:List[A]): BList[B]

เห็นได้ชัดว่าฉันไม่สามารถโทรmapเข้ารายการได้ แต่ฉันสามารถใช้ซิปรายชื่อได้ ซิปเป็นเคอร์เซอร์เพื่อเลื่อนไปรอบ ๆ รายการ ให้การเข้าถึงองค์ประกอบปัจจุบัน ( focus) และเพื่อนบ้าน

ตอนนี้ฉันสามารถแทนที่ของฉันfด้วย def f'(z:Zipper[A]):B = f(z.focus, z.left)และผ่านฟังก์ชั่นใหม่นี้f'จะใช้วิธีการcobindZipper[A]

การcobindทำงานในลักษณะนี้: เรียกสิ่งนั้นf'ด้วยซิปจากนั้นเลื่อนซิปเรียกf'ด้วยซิปใหม่ "ย้าย" เลื่อนซิปอีกครั้งและอื่น ๆ ... จนกระทั่งซิปไปถึงจุดสิ้นสุดของรายการ

ในที่สุดการcobindส่งคืนประเภทซิปใหม่Zipper[B]ซึ่งสามารถเปลี่ยนเป็นรายการและเพื่อให้ปัญหาได้รับการแก้ไข

ตอนนี้สังเกตความสมมาตรระหว่างcobind[A](f:Zipper[A] => B):Zipper[B]และbind[A](f:A => List[B]):List[B]นั่นคือเหตุผลที่Lista MonadและZipperเป็นComonad.

มันเข้าท่าไหม?


1
ฉันไม่ใช่ผู้เชี่ยวชาญ แต่นั่นก็สมเหตุสมผลสำหรับฉัน ฉันมีความศักดิ์สิทธิ์ในขณะที่อ่านคำอธิบายของคุณ ขอบคุณ!
acjay

7
คำถามของคุณตอบยากมากในรูปแบบ SO ... แต่คุณถูกต้องที่สุด Zippers ที่เน้นองค์ประกอบเป็นสิ่งสำคัญเสมอ
J. Abrahamson

4
รายการสามารถดูเป็น comonad ได้เช่นกัน (หลายวิธี) ในขณะที่ Zipper สามารถใช้เป็น monad ได้ (หลายวิธีด้วย) ความแตกต่างอยู่ที่ว่าคุณเน้นแนวความคิดไปที่ข้อมูล "ผนวก" อย่างสร้างสรรค์ไปยังเครื่องของรัฐ (นั่นคือสิ่งที่เกี่ยวกับอินเทอร์เฟซ Monad) หรือ "แยก" สถานะจากมัน "แยกโครงสร้าง" (นั่นคือสิ่งที่ Comonad ทำ) ไม่ใช่เรื่องง่ายที่จะตอบคำถามโดยระบุว่า "ความเข้าใจนี้เหมาะสมหรือไม่" อย่างไรก็ตาม ในบางแง่ก็เป็นเช่นนั้นในอีกแง่หนึ่งก็ไม่ได้
KT.

2
ในการโยนบางสิ่งลงใน comonad คุณต้องจัดเตรียมการดำเนินการสองอย่าง: 1) การแยกค่า (เช่นอาจเป็นส่วนหัวของรายการ) และ 2) การประยุกต์ใช้การดำเนินการประมวลผลรายการ (เช่นคุณสามารถใช้ในการเลื่อน - ลักษณะหน้าต่างตามรายการหรือในลักษณะที่ชาญฉลาดหรือในลักษณะที่คล้ายกันสมมติว่าการแปลงหน่วยที่เหมาะสมจะไม่เปลี่ยนรายการ) วิธีการประมวลผลรายการดังกล่าวเหมาะสมหรือไม่นั้นเป็นปัญหาที่แยกต่างหาก โปรดทราบว่าอินเทอร์เฟซ comonad เปล่าไม่ได้ให้ทั้งวิธีสร้างรายการหรือข้ามผ่าน เพียงแค่รู้วิธีใช้การดำเนินการรายการที่ทราบ
KT.

2
@eenblam คุณพูดถูก ฉันจะเพิ่มคำตอบและจะทำให้คำถามนี้หลุดจากรายการที่ยังไม่มีคำตอบฉันหวังว่า
Michael

คำตอบ:


1

เนื่องจากคำถามนี้ปรากฏขึ้นเป็นประจำในรายการ "ที่ยังไม่มีคำตอบ" ให้ฉันคัดลอกความคิดเห็นของฉันเป็นคำตอบที่นี่ - ไม่มีอะไรที่สร้างสรรค์กว่านี้มาตั้งแต่ปีที่แล้วแล้ว

A Listสามารถถูกมองว่าเป็น comonad ได้เช่นกัน (หลายวิธี) ในขณะที่Zipperสามารถแสดงเป็น monad ได้ (หลายวิธีด้วย) ความแตกต่างอยู่ที่ว่าคุณให้ความสำคัญกับแนวคิดในการ "ผนวก" ข้อมูลอย่างสร้างสรรค์ไปยังเครื่องสถานะ (นั่นคือสิ่งที่Monadเกี่ยวกับอินเทอร์เฟซ) หรือ "แยก" สถานะจากมัน "แยกโครงสร้าง" (นั่นคือสิ่งที่Comonadทำ)

ไม่ใช่เรื่องง่ายที่จะตอบคำถามโดยระบุว่า "ความเข้าใจนี้เหมาะสมหรือไม่" อย่างไรก็ตาม ในบางแง่ก็เป็นเช่นนั้นในอีกแง่หนึ่งก็ไม่ได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.