Comonad typeclass ใน Haskell คืออะไร?


105

Comonad typeclass ใน Haskell คืออะไร? เช่นเดียวกับใน Comonad จากControl.Comonad ในแพ็คเกจ comonad (ยินดีต้อนรับคำอธิบายของแพ็คเกจอื่น ๆ ที่มีคลาสประเภท Comonad ด้วย) ผมเคยได้ยินเกี่ยวกับราง Comonad แต่ทั้งหมดที่ผมรู้เกี่ยวกับมันว่าจะให้extract :: w a -> aเรียงลำดับของขนานไป return :: a -> m aMonad

คะแนนโบนัสสำหรับการสังเกตการใช้งาน Comonad แบบ "ชีวิตจริง" ในโค้ด "ของจริง"


ฉันอยากจะเห็นความแตกต่างระหว่าง "co" กับ normal คืออะไร ฉันรู้ว่าโมนาดคืออะไร ดังนั้นถ้าฉันรู้ว่า“ เพื่อน” หมายถึงอะไรฉันก็สามารถสรุปได้ว่า comonad คืออะไรและเข้าใจมันอย่างลึกซึ้ง คำตอบของ Alexey Romanov ไม่ได้ทำอะไรเลยในแง่มุมนั้น
Evi1M4chine

2
@ Evi1M4chine: "co" (หลวม ๆ ) หมายถึง "พลิกลูกศร" นี่คือภาพคร่าวๆของสิ่งนั้น พิจารณาการดำเนินการแบบ monadic: return :: a ~> m a, flip bind :: (a ~> m b) -> (m a ~> m b). ย้อนกลับลูกศรไก่เขี่ยและคุณได้รับการดำเนินการ comonadic: extract :: a <~ w a, extend :: (a <~ w b) -> (w a <~ w b)( extract :: w a -> a, extend :: (w a -> b) -> w a -> w b)
แดนเบอร์

ขอบคุณ @Dan Burton …ในขณะที่อยู่กับโมนาดคุณทำงานกับ“ ข้างใน” (การบรรจุสิ่งใหม่ ๆ และการเปลี่ยนแปลงเข้ามา) โดยมีเพื่อนร่วมทางคุณทำงานกับ“ ภายนอก” (นำสิ่งต่างๆออกไปในที่สุดหรือเพียงเพื่อแก้ไข) . มุมมองนั้นถูกต้องหรือไม่? เพราะมันช่วยได้มากอย่างแน่นอนกับความเข้าใจที่ลึกซึ้ง
Evi1M4chine

comonads สามารถใช้เพื่อสร้างแบบจำลองเอฟเฟ็กต์ร่วม นี่คือคำแนะนำที่ดีเกี่ยวกับ coeffects: tomasp.net/coeffects
zeronone

คำตอบ:


83

ลิงก์เหล่านี้อาจเป็นประโยชน์:

  1. การประเมิน automata ถือเป็น comonadic โดยเฉพาะอย่างยิ่ง "เมื่อใดก็ตามที่คุณเห็นโครงสร้างข้อมูลขนาดใหญ่ที่ปะติดปะต่อจากการคำนวณขนาดเล็ก แต่คล้ายกันจำนวนมากมีโอกาสดีที่เราจะจัดการกับคอมโมนาด"
  2. ลำดับสตรีมและเซ็กเมนต์
  3. Comonads ในชีวิตประจำวัน

1
+1 ลิงค์แรกเป็นลิงค์ที่นำมารวมกันสำหรับฉันจริงๆ
luqui

42
คำตอบแบบลิงก์เท่านั้นอย่างน้อยควรมีสรุปเนื้อหาที่เชื่อมโยง ขณะนี้คำตอบนี้ไม่เหมาะสำหรับการเป็นคำตอบ SO ที่ดี ลองขยายความอีกเล็กน้อยเพื่อให้สามารถยืนได้ด้วยตัวเองโดยไม่มีบทความที่เชื่อมโยง
Bakuriu

3
"เมื่อใดก็ตามที่คุณเห็นโครงสร้างข้อมูลขนาดใหญ่ที่ปะติดปะต่อจากการคำนวณขนาดเล็ก แต่คล้ายกันจำนวนมากมีโอกาสดีที่เราจะจัดการกับคอมโมนาด" .... นั่นหมายความว่าแฟรกเมนต์เชเดอร์เป็นคอมโมนาดิคหรือไม่?
Sam Kellett

ผมพบว่าตัวอย่างนี้ของextendที่จะเป็นประโยชน์
Chris Penner

22

สิ่งนี้ไม่สามารถตอบคำถามของฉันได้ทั้งหมด แต่ฉันต้องการใส่ข้อมูลที่เกี่ยวข้องในรูปแบบคำตอบ:

"co" (หลวม ๆ ) หมายถึง "พลิกลูกศร" นี่คือภาพคร่าวๆของสิ่งนั้น

พิจารณาการดำเนินการแบบ monadic:

return :: a ~> m a
flip (>>=) :: (a ~> m b) -> (m a ~> m b)

ย้อนกลับลูกศร squiggly และคุณจะได้รับการดำเนินการ comonadic:

extract :: a <~ w a
extend :: (a <~ w b) -> (w a <~ w b)

(เขียนด้วยลูกศรปกติ)

extract :: w a -> a
extend :: (w a -> b) -> w a -> w b

แจ้งให้ทราบว่าในรูปแบบนี้returnเป็นลูกศรที่เกิดขึ้นเพียงเพื่อให้พอดีกับช่องอาร์กิวเมนต์สำหรับflip (>>=)และเดียวกันเป็นจริงของและextract extendกฎหมาย Monad / comonad บอกว่าเมื่อคุณใส่returnหรือextractเข้าไปในสล็อตนั้นผลลัพธ์คือลูกศรประจำตัว กฎหมายเหมือนกัน "เพียงแค่ลูกศรพลิก" นั่นเป็นคำตอบที่ดีเยี่ยม แต่หวังว่ามันจะให้ข้อมูลเชิงลึก


2
คำตอบของคุณเข้ากันได้ดีกับการหลีกเลี่ยงการเข้าใจผิดเกี่ยวกับการสอนแบบโมนาด Monads (และ comonads) เป็นเพียงอินเทอร์เฟซ แม้ว่ามันจะเป็นเรื่องดีมากที่รู้ว่าพวกเขาตั้งใจอย่างไร เช่นเดียวกับ: แนวคิดเบื้องหลังพวกเขา
Evi1M4chine
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.