Chìa khóa với lập trình chức năng không phải là không có trạng thái, mà là có trạng thái rõ ràng .
Điều này có nghĩa là, trạng thái của bạn được truyền xung quanh như là một tham số cho các chức năng của bạn. Đó là một giá trị thực tế, mà bạn có thể nắm trong tay, nhìn vào và chuyển sang các chức năng khác.
Ví dụ: chúng ta hãy xem phương pháp Lập trình động để tính toán các số Fibonacci. Trong một ngôn ngữ bắt buộc, bạn sẽ có một cái gì đó như thế này:
def fib(n):
A = {}
A[0] = 0
A[1] = 1
for i in [2 .. n+1]:
A[i] = A[i-1] + A[i-2]
return A[n]
Để làm điều này mà không có nhà nước, bạn chỉ cần thông qua cửa hàng của bạn xung quanh. Sử dụng cú pháp Haskell-ish:
fib n = fibHelper 2 n {(1,1), (0,0)}
fibHelper i end cache =
if
i > end
then
lookup end cache
else
let
newVal = (lookup (i-1) cache) + (lookup (i-2) cache)
newCache = insert i newVal cache
in
fibHelper (i+1) end newCache
Bây giờ, đây là một chút khó khăn, vì bạn không cần toàn bộ mảng cho các số Fibonacci, nhưng bạn có thể tưởng tượng sử dụng điều này cho các vấn đề lập trình động phức tạp hơn như Knapsack, nơi bạn cần toàn bộ các giá trị được tính toán trước đó.
Điều quan trọng cần hiểu ở đây là insert
một chức năng lấy một cửa hàng và trả về một cửa hàng mới, bằng với giá trị ban đầu với một giá trị gia tăng mới. Giá trị ban đầu của cache
không bị phá hủy, vì vậy nếu bạn có một ứng dụng mà bạn cần một số hoạt động "hoàn tác", bạn có thể theo dõi lịch sử của tiểu bang của mình.
Bạn có thể nói "nhưng điều đó có vẻ không hiệu quả! Bạn đang tạo một cửa hàng hoàn toàn mới mỗi lần!" Tuy nhiên, thông thường trong các ngôn ngữ chức năng, những điều này được triển khai một cách khéo léo bằng cách sử dụng các tham chiếu, do đó không có các bản sao hoàn toàn mới của dữ liệu nằm xung quanh.
Điều đáng nói là mô hình này có một tham số trạng thái, chuyển nó xung quanh khi quá trình tính toán của bạn tiến triển và sửa đổi nó, là rất phổ biến. Mọi người đã phát minh ra sự trừu tượng, như Nhà nước đơn nguyên , cho phép bạn viết những thứ có vẻ bắt buộc, nhưng hoàn toàn là chức năng "dưới mui xe".