การแสดงออกของการคำนวณเหมือนกับ monad หรือไม่?


22

ฉันยังคงเรียนรู้การเขียนโปรแกรมฟังก์ชั่น (ด้วย f #) และฉันเพิ่งเริ่มอ่านเกี่ยวกับนิพจน์การคำนวณ ฉันยังไม่เข้าใจแนวคิดและสิ่งหนึ่งที่ทำให้ฉันไม่แน่ใจเมื่ออ่านบทความทั้งหมดเกี่ยวกับพระ (ส่วนใหญ่เขียนจากฐานของ Haskell) คือความสัมพันธ์ระหว่างนิพจน์การคำนวณกับพระ

ต้องเขียนทั้งหมดที่นี่เป็นคำถามของฉัน (จริง ๆ แล้วสองคำถาม):

การคำนวณการคำนวณ F # ทุกครั้งเป็น Monad หรือไม่? Monad ทุกคนสามารถแสดงออกด้วยการคำนวณการคำนวณ F # ได้หรือไม่?

ฉันได้อ่านนี้โพสต์ของโทมัส Petricek และถ้าผมเข้าใจมันได้ดีก็ระบุว่าการแสดงออกการคำนวณมากกว่า monads แต่ผมไม่แน่ใจว่าถ้าผมแปลความหมายนี้ได้อย่างถูกต้อง


@ ราฟาเอลฉันจะถามเหตุผลของการลบแท็ก lang ได้อย่างไร
Grzegorz Sławecki

2
เนื่องจากเราใส่ใจเกี่ยวกับแนวคิดเราจึงพยายามรักษาทุกสิ่งที่ไม่เชื่อเรื่องภาษาไว้ที่นี่ ฉันไม่ทราบว่าการลบ F # ทำอะไรกับคำถาม ( ฉันคิดว่าถ้าเป็นสิ่งสำคัญที่เป็น F # คำถามจะไม่ตรงประเด็นที่นี่ แต่เป็นกรณีของเส้นแบ่งเขต) ดังนั้นฉันจึงลบแท็ก F # เท่านั้น Rule of thumb: F # ไม่ใช่แนวคิด CS ดังนั้นจึงไม่จำเป็นต้องใช้แท็ก (ใช่ฉันรู้แท็ก PL อื่นและฉันไม่ชอบพวกเขาเช่นกันสำหรับคำถามบางชุมชนตัดสินใจว่าพวกเขารับประกันแท็กเหล่านี้)
Raphael

1
@ ราฟาเอลฉันเชื่อว่าคำถามนี้เป็นคดีเขตแดน มีคนตัดสินใจที่จะย้ายมาที่นี่ แต่ดูเหมือนว่าจะเป็นหัวข้อเล็กน้อยที่นี่เช่นกัน คำถามตัวเองเป็นประเภทของคอมพิวเตอร์ตั้งแต่ แต่ในเวลาเดียวกันทั้งคำตอบและคำถามที่เกี่ยวข้องโดยเฉพาะกับ f # ฉันเข้าใจกฎของหัวแม่มือของคุณขอบคุณสำหรับการชี้แจง
Grzegorz Sławecki

คำตอบ:


22

แรกของทุกการแสดงออกทางคำนวณเป็นคุณลักษณะภาษาในขณะที่monadsมีแนวคิดทางคณิตศาสตร์ดังนั้นจากมุมมองนี้พวกเขาจะแตกต่างอย่างสิ้นเชิงสิ่ง

แต่นั่นไม่ใช่คำตอบที่มีประโยชน์มาก :-) นิพจน์การคำนวณเป็นคุณลักษณะภาษาที่ให้ไวยากรณ์ซึ่งสามารถใช้สำหรับการเขียนโปรแกรมด้วยการคำนวณ (หรือชนิดข้อมูล) ที่มีโครงสร้าง monadic แต่สามารถใช้กับโครงสร้างอื่นได้เช่นกัน คุณสามารถอ่านกระดาษสวนสัตว์นิพจน์การคำนวณ F # ของฉันสำหรับรายละเอียดเพิ่มเติม แต่สามารถใช้นิพจน์การคำนวณกับ:

  • Monads แต่ยัง monads เพิ่มเติม (สิ่ง Haskellers เรียกMonadPlusหรือMonadOr)
  • การคำนวณแบบรวม (สิ่งที่ Haskellers เรียกว่า monad transformers)
  • การคำนวณที่เป็น monadic แต่สนับสนุนโครงสร้าง F # อื่น ๆ เช่นการจัดการข้อยกเว้น
  • Monoids (และอีกสองรูปแบบที่ไม่มีการผูกแบบ monadic)
  • ฟังก์ชั่นการใช้งาน (แม้ว่านี่จะถูกนำไปใช้ในส่วนขยายการวิจัยเท่านั้น)

ดังนั้นการแสดงออกของการคำนวณจึงเชื่อมโยงกับพระอย่างแน่นอน แต่ไม่ได้เชื่อมโยงกับพวกเขาอย่างใกล้ชิด นี่คือความแตกต่างเช่นกับdoสัญกรณ์ของ Haskell ซึ่งเชื่อมโยงกับพระอย่างใกล้ชิดมากขึ้น (แม้ว่าจะสามารถใช้กับการคำนวณที่ไม่ได้ใช้คณิตศาสตร์อย่างเคร่งครัด)


3
Monad transformers เป็นวิธีทั่วไปในการแปลง monad หนึ่งไปยังอีก monad - F # การคำนวณการแสดงออกเพียงสนับสนุนการดำเนินการ / ผล / ของการเปลี่ยนแปลงนั้นโดยตรงมากกว่าการแปลงตัวเอง
GS - ขอโทษที่โมนิก้า

1
@GaneshSittampalam - ใช่คุณถูกต้อง ความพยายามในการลดความซับซ้อนของฉันไม่ใช่สิ่งที่มีประโยชน์ที่นี่ :-) นิพจน์การคำนวณสามารถให้ซินแทกซ์แก่คุณในการทำงานกับการคำนวณที่เป็นผลมาจากการใช้หม้อแปลง monad (โดยอาจมีไวยากรณ์ที่แตกต่างกันสำหรับ monad ต้นแบบและสำหรับ monad ที่แต่งขึ้น)
Tomas Petricek

5

คุณสามารถใช้การคำนวณการแสดงออกเพื่อแสดงพระ มีตัวอย่างเป็นที่นี่ นอกจากนี้ตามที่คุณบันทึกไว้คุณสามารถใช้นิพจน์การคำนวณได้มากกว่าการเป็นพระ มีคำอธิบายขยายเกี่ยวกับวิธีที่พวกเขามีความแตกต่างกันคือที่นี่ ไม่มีที่ว่างที่นี่เพื่ออธิบายความแตกต่างอย่างถูกต้อง แต่นิพจน์การคำนวณต่างจาก monads เนื่องจากพวกเขาใช้ไวยากรณ์ F # ปกติซ้ำและมีความสามารถในการเพิ่ม abstractions เพิ่มเติม ข้อ จำกัด ก็คือมันไม่ได้เป็นสำนวน (และยาก) ในการเขียนการแสดงออกการคำนวณซึ่งเป็น polymorphic มากกว่าประเภทของการคำนวณ


1
โปรดทำให้คำตอบของคุณมีตัวเองมากขึ้นโดยอย่างน้อยก็สรุปเนื้อหาบนหน้าที่คุณลิงก์ไป คำตอบปัจจุบันของคุณจะไม่มีความหมายอย่างสมบูรณ์หากทั้งสองลิงก์หยุดทำงาน
David Richerby

2
ฉันไม่แน่ใจว่าคุณกำลังพูดถึงเรื่องอะไร ฉันตอบคำถามอย่างชัดเจนจากนั้นให้ลิงก์ไปยังข้อมูลเพิ่มเติมหากผู้ถามสนใจ ลิงค์ไม่จำเป็นต้องตอบคำถาม
N_A

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