Trong lập trình chức năng vì hầu như tất cả các cấu trúc dữ liệu là bất biến, khi trạng thái phải thay đổi một cấu trúc mới được tạo. Điều này có nghĩa là sử dụng nhiều bộ nhớ hơn?
Điều đó phụ thuộc vào cấu trúc dữ liệu, những thay đổi chính xác mà bạn đã thực hiện và, trong một số trường hợp, trình tối ưu hóa. Như một ví dụ, hãy xem xét việc chuẩn bị trước một danh sách:
list2 = prepend(42, list1) // list2 is now a list that contains 42 followed
// by the elements of list1. list1 is unchanged
Ở đây, yêu cầu bộ nhớ bổ sung là không đổi - chi phí thời gian gọi của cuộc gọi cũng vậy prepend
. Tại sao? Bởi vì prepend
đơn giản là tạo ra một tế bào mới có 42
đầu và list1
đuôi. Nó không phải sao chép hoặc lặp đi lặp lại list2
để đạt được điều này. Đó là, ngoại trừ bộ nhớ cần thiết để lưu trữ 42
, list2
sử dụng lại cùng bộ nhớ được sử dụng list1
. Vì cả hai danh sách là bất biến, chia sẻ này là hoàn toàn an toàn.
Tương tự, khi làm việc với các cấu trúc cây cân bằng, hầu hết các hoạt động chỉ cần một lượng logarit của không gian bổ sung vì mọi thứ, nhưng một đường dẫn của cây có thể được chia sẻ.
Đối với mảng tình huống là một chút khác nhau. Đó là lý do tại sao, trong nhiều ngôn ngữ FP, mảng không được sử dụng phổ biến. Tuy nhiên, nếu bạn làm một cái gì đó giống arr2 = map(f, arr1)
và arr1
không bao giờ được sử dụng lại sau dòng này, trình tối ưu hóa thông minh thực sự có thể tạo mã arr1
thay đổi thay vì tạo một mảng mới (mà không ảnh hưởng đến hành vi của chương trình). Trong trường hợp đó, hiệu suất sẽ như trong một ngôn ngữ bắt buộc tất nhiên.