ขออภัยสำหรับคำถามข้างเคียงอีกคำถามของ FP + แต่ฉันไม่พบคำถามที่มีอยู่ซึ่งตอบคำถามนี้ให้ฉันได้
ความเข้าใจของฉัน (จำกัด ) ของการเขียนโปรแกรมเชิงฟังก์ชันคือผลกระทบของรัฐ / ผลข้างเคียงควรถูกย่อให้เล็กสุดและแยกจากตรรกะไร้สัญชาติ
ฉันยังรวบรวมวิธีการของ Haskell เพื่อทำสิ่งนี้ IO monad ประสบความสำเร็จในการทำสิ่งนี้ด้วยการห่อตัวการกระทำแบบ stateful ไว้ในคอนเทนเนอร์เพื่อการดำเนินการในภายหลังโดยพิจารณานอกขอบเขตของโปรแกรม
ฉันพยายามที่จะเข้าใจรูปแบบนี้ แต่จริงๆแล้วเพื่อตรวจสอบว่าจะใช้ในโครงการ Python หรือไม่ดังนั้นต้องการหลีกเลี่ยง Haskell ถ้ามี
ตัวอย่างที่เข้ามาหยาบ
หากโปรแกรมของฉันแปลงไฟล์ XML เป็นไฟล์ JSON:
def main():
xml_data = read_file('input.xml') # impure
json_data = convert(xml_data) # pure
write_file('output.json', json_data) # impure
ไม่ใช่วิธีการของ IO monad ในการทำสิ่งนี้อย่างมีประสิทธิภาพ:
steps = list(
read_file,
convert,
write_file,
)
ถ้าอย่างนั้นไม่ต้องเรียกขั้นตอนเหล่านั้นให้พ้นจากความรับผิดชอบแต่การให้ล่ามทำเช่นนั้น?
หรือกล่าวอีกนัยหนึ่งก็เหมือนการเขียน:
def main(): # pure
def inner(): # impure
xml_data = read_file('input.xml')
json_data = convert(xml_data)
write_file('output.json', json_data)
return inner
จากนั้นคาดหวังให้คนอื่นโทรมาinner()
และบอกว่างานของคุณเสร็จสิ้นเพราะmain()
มีความบริสุทธิ์
โปรแกรมทั้งหมดจะจบลงใน IO monad โดยพื้นฐานแล้ว
เมื่อรหัสที่เป็นจริงการดำเนินการทุกอย่างหลังจากที่ได้อ่านไฟล์ขึ้นอยู่กับสภาพของไฟล์นั้นเพื่อจะยังคงต้องทนทุกข์ทรมานจากข้อบกพร่องของรัฐที่เกี่ยวข้องเช่นเดียวกับการดำเนินการตามความจำเป็นอะไรก็มีคุณได้รับจริงเป็นโปรแกรมเมอร์ที่จะรักษานี้ได้หรือไม่
ฉันซาบซึ้งในประโยชน์ของการลดและแยกพฤติกรรมไร้รัฐซึ่งอันที่จริงแล้วทำไมฉันจึงสร้างเวอร์ชันที่มีความจำเป็นเช่นนั้น: รวบรวมอินพุตทำสิ่งที่บริสุทธิ์พ่นเอาท์พุทออกมา หวังว่าconvert()
จะบริสุทธิ์อย่างสมบูรณ์และได้รับผลประโยชน์จากความสามารถในการปรับตัวเธรดความปลอดภัย ฯลฯ
ฉันยังซาบซึ้งว่าประเภทของ monadic นั้นมีประโยชน์โดยเฉพาะในท่อที่ใช้กับประเภทที่เทียบเคียงกันได้ แต่ไม่เห็นว่าทำไม IO จึงควรใช้ monads ยกเว้นในท่อ
มีประโยชน์เพิ่มเติมในการจัดการกับผลข้างเคียงที่รูปแบบ IO monad นำมาซึ่งฉันพลาดไปหรือไม่?
main
โปรแกรม Haskell คือIO ()
- การกระทำของ IO นี่ไม่ใช่ฟังก์ชั่น แต่อย่างใด มันเป็นความคุ้มค่า โปรแกรมทั้งหมดของคุณเป็นค่าที่แท้จริงที่มีคำแนะนำที่บอกให้รันไทม์ภาษาสิ่งที่ควรทำ สิ่งที่ไม่บริสุทธิ์ทั้งหมด (จริงๆแล้วเป็นการกระทำของการกระทำ IO) อยู่นอกขอบเขตของโปรแกรมของคุณ
read_file
) และใช้เป็นอาร์กิวเมนต์ให้กับส่วนถัดไป ( write_file
) หากคุณมีลำดับของการกระทำที่เป็นอิสระคุณไม่จำเป็นต้องมี Monad