คำถามติดแท็ก zipper

7
วิธีที่สะอาดกว่าในการอัปเดตโครงสร้างที่ซ้อนกัน
สมมติว่าฉันมีสองสิ่งต่อไปนี้case class: case class Address(street: String, city: String, state: String, zipCode: Int) case class Person(firstName: String, lastName: String, address: Address) และตัวอย่างต่อไปนี้ของPersonคลาส: val raj = Person("Raj", "Shekhar", Address("M Gandhi Marg", "Mumbai", "Maharashtra", 411342)) ตอนนี้ถ้าผมต้องการที่จะปรับปรุงzipCodeของrajแล้วฉันจะต้องทำ: val updatedRaj = raj.copy(address = raj.address.copy(zipCode = raj.address.zipCode + 1)) ด้วยระดับที่มากขึ้นของการซ้อนสิ่งนี้จะทำให้น่าเกลียดยิ่งขึ้น มีวิธีที่สะอาดกว่า (เช่น Clojure's update-in) ในการอัปเดตโครงสร้างที่ซ้อนกันดังกล่าวหรือไม่?
124 scala  case-class  zipper 

1
ทำความเข้าใจว่าทำไม Zipper ถึงเป็น Comonad
นี่คือการติดตามคำตอบสำหรับคำถามก่อนหน้าของฉัน สมมติว่าฉันต้อง 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. มันเข้าท่าไหม?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.