ตามที่ระบุไว้โดย @KarlBielefeldt วิธีการทำงานของปัญหาดังกล่าวคือการดูว่าเป็นการคืนสถานะใหม่จากสถานะก่อนหน้า ฟังก์ชั่นตัวเองไม่เก็บข้อมูลใด ๆ เพื่อให้พวกเขามักจะอัปเดตรัฐมไปยังรัฐn
ฉันคิดว่าคุณพบว่าไม่มีประสิทธิภาพนี้เพราะคุณคิดว่ารัฐก่อนหน้าจะต้องถูกเก็บไว้ในหน่วยความจำในขณะที่คำนวณสถานะใหม่ ขอให้สังเกตว่าตัวเลือกระหว่างการเขียนสถานะใหม่ทั้งหมดหรือการเขียนแบบเก่าใหม่นั้นเป็นรายละเอียดการนำไปปฏิบัติจากมุมมองของภาษาที่ใช้งานได้
ตัวอย่างเช่นสมมติว่าฉันมีรายการของจำนวนเต็มหนึ่งล้านและต้องการเพิ่มสิบต่อหนึ่งหน่วย การคัดลอกรายการทั้งหมดด้วยหมายเลขใหม่ในตำแหน่งที่สิบนั้นสิ้นเปลืองคุณพูดถูก แต่มันเป็นเพียงวิธีการทางความคิดในการอธิบายการดำเนินการกับตัวแปลภาษาหรือล่าม คอมไพเลอร์หรือล่ามมีอิสระที่จะใช้รายการแรกและเพียงแค่เขียนทับตำแหน่งที่สิบ
ข้อดีของการอธิบายการดำเนินการในลักษณะนี้คือคอมไพเลอร์สามารถให้เหตุผลเกี่ยวกับสถานการณ์เมื่อเธรดจำนวนมากต้องการอัปเดตรายการเดียวกันที่ตำแหน่งต่าง ๆ หากการดำเนินการถูกอธิบายว่า "ไปที่ตำแหน่งนี้และเขียนทับสิ่งที่คุณค้นหา" แสดงว่าเป็นโปรแกรมเมอร์ไม่ใช่ผู้แปลซึ่งรับผิดชอบการทำให้แน่ใจว่าการเขียนทับไม่เกิดการชนกัน
จากทั้งหมดที่กล่าวถึงแม้ใน Haskell จะมีmonad stateที่ช่วยในการสร้างแบบจำลองสถานการณ์ที่ "การรักษาสถานะ" นั้นเป็นทางออกที่ใช้งานง่ายกว่าสำหรับปัญหา แต่โปรดสังเกตเห็นปัญหาบางอย่างที่คุณพบ " stateful โดยเนื้อแท้เช่นการเขียนไปยังฐานข้อมูล " มีการแก้ปัญหาไม่เปลี่ยนรูปเหมือน Datomic สิ่งนี้อาจทำให้คุณประหลาดใจจนกระทั่งคุณเข้าใจว่ามันเป็นแนวคิด