ฉันจะใช้คำอธิบายภาษาที่ไม่เชื่อเรื่องพระเจ้าของ monads เช่นนี้ก่อนอธิบาย monoids:
หนังสือคือ ( ๆ ) ชุดของฟังก์ชั่นที่ใช้บางชนิดเป็นพารามิเตอร์และส่งกลับชนิดเดียวกัน
monadเป็น ( ๆ ) ชุดของฟังก์ชั่นที่ใช้เป็นกระดาษห่อประเภทเป็นพารามิเตอร์และส่งกลับชนิดกระดาษห่อเดียว
หมายเหตุเหล่านั้นคือคำอธิบายไม่ใช่คำจำกัดความ รู้สึกอิสระที่จะโจมตีคำอธิบายนั้น!
ดังนั้นในภาษา OO monad อนุญาตให้มีองค์ประกอบการดำเนินการเช่น:
Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land()
โปรดทราบว่า monad กำหนดและควบคุมซีแมนทิกส์ของการดำเนินการเหล่านั้นมากกว่าคลาสที่มีอยู่
ตามเนื้อผ้าในภาษา OO เราจะใช้ลำดับชั้นและการสืบทอดเพื่อให้ความหมายเหล่านั้น ดังนั้นเราจึงต้องการมีBird
ระดับด้วยวิธีการtakeOff()
, flyAround()
และland()
และเป็ดจะได้รับมรดกเหล่านั้น
แต่แล้วเราก็มีปัญหากับนกที่บินไม่ได้เพราะpenguin.takeOff()
ล้มเหลว เราต้องหันไปใช้ข้อยกเว้นในการขว้างและจัดการ
นอกจากนี้เมื่อเราบอกว่าเพนกวินเป็นเราทำงานเป็นปัญหากับมรดกหลายตัวอย่างเช่นถ้าเรายังมีลำดับชั้นของBird
Swimmer
โดยพื้นฐานแล้วเรากำลังพยายามที่จะใส่คลาสเป็นหมวดหมู่ (ด้วยการขอโทษกับหมวดหมู่ทฤษฎีพวก) และกำหนดความหมายตามหมวดหมู่มากกว่าในแต่ละชั้นเรียน แต่พระสงฆ์ดูเหมือนจะเป็นกลไกที่ชัดเจนกว่าสำหรับการทำเช่นนั้นมากกว่าลำดับชั้น
ดังนั้นในกรณีนี้เราจะมีFlier<T>
monad เหมือนตัวอย่างด้านบน:
Flier<Duck> m = new Flier<Duck>(duck).takeOff().flyAround().land()
... Flier<Penguin>
และเราจะไม่ยกตัวอย่าง เราสามารถใช้การพิมพ์แบบคงที่เพื่อป้องกันสิ่งนั้นไม่ให้เกิดขึ้นด้วยอินเทอร์เฟซของตัวทำเครื่องหมาย หรือการตรวจสอบความสามารถรันไทม์เพื่อประกันตัว แต่จริงๆแล้วโปรแกรมเมอร์ไม่ควรวางเพนกวินลงใน Flier ในลักษณะเดียวกันพวกเขาไม่ควรหารด้วยศูนย์
นอกจากนี้ยังสามารถใช้งานได้ทั่วไป นักบินไม่จำเป็นต้องเป็นนก ตัวอย่างเช่นFlier<Pterodactyl>
หรือFlier<Squirrel>
โดยไม่เปลี่ยนความหมายของประเภทบุคคลเหล่านั้น
เมื่อเราจำแนกซีแมนทิกส์โดยฟังก์ชั่นที่สามารถคอมโพสิตบนคอนเทนเนอร์ - แทนที่จะใช้กับประเภทของลำดับชั้น - มันจะแก้ไขปัญหาเก่า ๆ กับคลาสที่ "ชนิดของสิ่งที่ต้องทำไม่เหมาะ" กับลำดับชั้นที่เฉพาะเจาะจง นอกจากนี้ยังได้อย่างง่ายดายและช่วยให้ความหมายได้อย่างชัดเจนหลายชั้นเหมือนเช่นเดียวกับFlier<Duck>
Swimmer<Duck>
ดูเหมือนว่าเรากำลังดิ้นรนกับความไม่ตรงกันของอิมพีแดนซ์โดยการจำแนกพฤติกรรมกับลำดับชั้นของชั้นเรียน พระจัดการอย่างหรูหรา
ดังนั้นคำถามของฉันก็คือในทำนองเดียวกับที่เราได้ให้การสนับสนุนการแต่งเรื่องการถ่ายทอดทางพันธุกรรม
(BTW ฉันไม่แน่ใจว่าควรจะอยู่ที่นี่หรือใน Comp Sci แต่นี่ดูเหมือนจะเป็นปัญหาการสร้างแบบจำลองในทางปฏิบัติ แต่อาจจะดีกว่าที่นั่น)