เมื่อเร็ว ๆ นี้ฉันได้ปัดความรู้ของฉันเกี่ยวกับวิธีการทำงานของ Monads ฉันยังได้รับการแนะนำให้รู้จักกับแนวคิดของการเป็น'Comonad'ซึ่งจะอธิบายเป็นผกผันสองของ monad อย่างไรก็ตามฉันไม่สามารถคาดศีรษะได้
เพื่อทำความเข้าใจ Monads ฉันได้ทำการเปรียบเทียบของตัวเอง:
Monads สามารถมองเห็นเป็น 'พิมพ์เขียวเพื่อสร้างสายพานลำเลียงของการแสดงออก'
ในการกำหนด Monad ใหม่ (ระบบสายพานแบบใหม่) คุณต้องกำหนด:
- วิธีวางสิ่งของบนสายพานลำเลียงเช่น 'เริ่ม' สายพาน (รู้จักในชื่อ
unit
หรือreturn
)- วิธีเชื่อมต่อเครื่อง (นิพจน์) ที่จะเป็นส่วนหนึ่งของสายพานลำเลียงเข้ากับสายพาน (ที่รู้จักกัน
join
หรือbind
หรือ>>=
)(มีการดำเนินการที่สามที่ใช้สายพานลำเลียงในปัจจุบันโยนเนื้อหาออกไปและเริ่มสายพานลำเลียงใหม่ที่รู้จักกันในนาม
>>
แต่ใช้งานบ่อยครั้งมาก)เพื่อให้เครื่องจักรและสายพานทำงานร่วมกันอย่างเหมาะสมคุณจะต้องตรวจสอบให้แน่ใจว่า:
- หากคุณใส่อะไรลงบนสายพานลำเลียงและส่งผ่านเครื่องผลลัพธ์ที่ได้ควรจะเหมือนกับเมื่อคุณส่งผ่านเครื่องด้วยตนเอง (ข้อมูลประจำตัวด้านซ้าย)
- หากคุณต้องการใส่สายพานลำเลียงระหว่างสายพานที่มีอยู่แล้วคุณไม่ควรท้ายด้วยสายพานลำเลียงที่มีสายพานลำเลียงอยู่ด้านบน แต่ควรเป็นสายพานที่ยาวกว่า (เอกลักษณ์ที่ถูกต้อง)
- มันไม่สำคัญสำหรับผลลัพธ์ถ้าคุณใช้เครื่อง A ด้วยตนเองแล้วส่งผลลัพธ์ผ่าน BC ที่เชื่อมต่อกับเครื่องลำเลียงหรือถ้าคุณใช้ AB ที่เชื่อมต่อกับเครื่องลำเลียงแล้วจากนั้นส่งผลลัพธ์ด้วยตนเองผ่าน C ในคำอื่น ๆ : (( >> = b) >> = c) ควรเหมือนกับ (a >> = (b >> = c)) (Associativity)
สายพานลำเลียงที่ง่ายที่สุดจะเป็นสายพานที่รับเข้ามาและจะดำเนินต่อไปยังนิพจน์ถัดไป นี่คือสิ่งที่ 'ท่อ' คือ
ความเป็นไปได้อีกอย่างหนึ่งคือการปล่อยให้มันผ่านเครื่องถัดไปหากเงื่อนไขบางอย่างตรงกับค่า ซึ่งหมายความว่าหากบางนิพจน์อยู่ระหว่างค่าจะเปลี่ยนเป็นบางสิ่งที่ไม่ได้รับอนุญาตอีกต่อไปส่วนที่เหลือของนิพจน์จะถูกข้ามไป นี่คือสิ่งที่ 'อาจจะ' monad ทำใน Haskell
นอกจากนี้คุณยังสามารถทำตามกฎการคัดลอก / เปลี่ยนแปลงเงื่อนไขแฟนซีอื่น ๆ เกี่ยวกับค่าก่อนหรือหลังจากที่คุณส่งไปยังเครื่อง ตัวอย่าง: ตัวแยกวิเคราะห์ (ที่นี่หากนิพจน์ส่งคืนผลลัพธ์ 'ความล้มเหลว' ค่าจาก ก่อนที่นิพจน์จะใช้เป็นเอาต์พุต)
แน่นอนว่าการเปรียบเทียบนั้นไม่สมบูรณ์แบบ แต่ฉันหวังว่ามันจะให้การเป็นตัวแทนที่ดีของวิธีการทำงานของ monads
อย่างไรก็ตามฉันมีปัญหามากมายที่จะเปิดการเปรียบเทียบนี้บนหัวของมันเพื่อทำความเข้าใจ Comonads ฉันรู้จากข้อมูลจำนวนเล็กน้อยที่ฉันพบบนอินเทอร์เน็ตที่ Comonad กำหนด:
extract
ซึ่งเป็นการเรียงลำดับย้อนกลับของreturn
นั่นคือมันใช้ค่าออกจาก Comonadduplicate
ซึ่งเป็นสิ่งที่ตรงกันข้ามกับjoin
กล่าวคือมันสร้าง Comonads สองอันจากอันเดียว
แต่ Comonad สามารถสร้างอินสแตนซ์ได้อย่างไรถ้าเราสามารถดึงออกมาจากพวกมันหรือทำซ้ำพวกมันได้? และพวกเขาสามารถนำไปใช้จริงได้อย่างไร? ฉันได้เห็นโครงการที่น่าอัศจรรย์นี้มากและการพูดคุยเกี่ยวกับมัน (ซึ่งฉันโชคไม่ดีที่เข้าใจน้อยมาก) แต่ฉันไม่แน่ใจว่า Comonad เป็นส่วนหนึ่งของฟังก์ชั่นใดบ้าง
Comonad คืออะไร มีประโยชน์อะไรบ้าง? พวกเขาจะถูกนำไปใช้อย่างไร? พวกมันกินได้หรือไม่?
IO
monad เป็นระบบรันไทม์ Haskell main
ซึ่งจะเรียก นอกจากนี้ยังมีunsafePerformIO
แน่นอน หากคุณต้องการที่จะคิดของMaybe
monad ว่าเป็น "เครื่องในตอนท้ายของสายพานลำเลียงที่" maybe
คุณสามารถใช้
cobind
แอปพลิเคชันจะต้องมีฟังก์ชั่นบางอย่างที่ทำสิ่งที่มีประโยชน์กับการเป็นตัวแทนภายในของ comonad ของคุณ