Theo ghi nhận của @KarlBielefeldt, cách tiếp cận chức năng cho vấn đề như vậy là xem nó như trả về một trạng thái mới từ trạng thái trước đó. Bản thân các hàm không chứa bất kỳ thông tin nào, vì vậy chúng sẽ luôn cập nhật trạng thái m thành trạng thái n .
Tôi nghĩ rằng bạn thấy điều này không hiệu quả vì bạn cho rằng trạng thái trước đó phải được lưu trong bộ nhớ trong khi tính toán trạng thái mới. Lưu ý rằng sự lựa chọn giữa việc viết một trạng thái hoàn toàn mới hoặc viết lại trạng thái cũ là một chi tiết triển khai theo quan điểm của một ngôn ngữ chức năng.
Chẳng hạn, giả sử tôi có một danh sách một triệu số nguyên và muốn tăng một phần mười lên một đơn vị. Sao chép toàn bộ danh sách với một số mới ở vị trí thứ mười của nó là lãng phí, bạn đã đúng; nhưng nó chỉ là cách khái niệm để mô tả hoạt động cho trình biên dịch ngôn ngữ hoặc trình thông dịch. Trình biên dịch hoặc trình thông dịch có thể tự do lấy danh sách đầu tiên và chỉ ghi đè lên vị trí thứ mười.
Ưu điểm của việc mô tả hoạt động theo cách này là trình biên dịch có thể giải thích về tình huống khi nhiều luồng muốn cập nhật cùng một danh sách ở các vị trí khác nhau. Nếu thao tác được mô tả là "đi đến vị trí này và ghi đè lên những gì bạn tìm thấy", thì đó là lập trình viên, không phải trình biên dịch, người chịu trách nhiệm đảm bảo rằng ghi đè không va chạm.
Với tất cả những gì đã nói, ngay cả trong Haskell cũng có một đơn vị Nhà nước giúp mô hình hóa các tình huống trong đó "giữ trạng thái" là một giải pháp trực quan hơn cho một vấn đề. Nhưng xin vui lòng lưu ý một số vấn đề mà bạn thấy " vốn đã có trạng thái, như viết vào cơ sở dữ liệu " có các giải pháp bất biến như Datomic . Điều này có thể gây ngạc nhiên cho đến khi bạn hiểu nó là một khái niệm, không nhất thiết phải nhận ra nó.