Hôm nay () là một hàm không tinh khiết vì kết quả của nó phụ thuộc vào thứ mà bạn không cung cấp cho nó; Cụ thể, thời gian hệ thống hiện tại. Do đó, kết quả của nó không mang tính quyết định khi chỉ dựa trên các đầu vào được cung cấp khi gọi.
Một chức năng thuần túy sẽ là int Add(int a, int b) {return a + b;}
. Hàm này chỉ hoạt động với những gì nó được cung cấp và không sử dụng dữ liệu trạng thái bên ngoài nào khác. Kết quả tự nhiên của việc này là bạn có thể Add(2,2)
và nhận được 4 từ giờ cho đến hết thời gian. Ngoài ra, do chức năng không thay đổi bất kỳ trạng thái bên ngoài nào (nó không có "tác dụng phụ"), nên Add () ing 2 và 2 từ giờ cho đến khi hết thời gian sẽ không thay đổi bất cứ điều gì khác trong hệ thống, trừ khi bạn gán kết quả của hàm cho một biến hoặc sử dụng giá trị để cập nhật trạng thái (đây không phải là thao tác được thực hiện bởi chính hàm đó). Hầu như tất cả các hoạt động toán học cổ điển là các hàm thuần túy và có thể được thực hiện như vậy.
Hôm nay (), mặt khác, có thể tạo ra cùng một giá trị khi được gọi hai lần liên tiếp, nhưng không được gọi liên tục trong vài ngày. Điều này là do nó phụ thuộc vào dữ liệu trạng thái bên ngoài mà bạn không cung cấp dưới dạng tham số cho hàm. Do đó, trong phạm vi của chương trình, không thể kiểm soát kết quả của hàm Today (). Nó sẽ tạo ra một giá trị nhất định vào một ngày nhất định và sẽ không bao giờ tạo ra giá trị đó vào bất kỳ ngày nào khác, trừ khi bạn thay đổi đồng hồ hệ thống của máy tính chạy trên đó (một thay đổi thường xảy ra bên ngoài ranh giới của chương trình).
Một chức năng không tinh khiết không nhất thiết là một điều xấu; Các chức năng không tinh khiết được yêu cầu, ngay cả trong các ngôn ngữ chức năng, để tương tác với bất kỳ thứ gì bên ngoài ranh giới của chương trình, chẳng hạn như lưu trữ dữ liệu, đường ống truyền thông, màn hình UI, thiết bị ngoại vi, v.v. Một chương trình không làm bất kỳ điều gì trong số này là chương trình đó là hạn chế mạnh mẽ trong tiện ích của nó; Tôi thậm chí sẽ đi xa đến mức gọi một chương trình tầm thường như vậy, vì không có bất kỳ phương tiện nào để chấp nhận đầu vào hoặc bất kỳ con đường nào để thông báo cho bạn về đầu ra của nó, nó cũng có thể không làm gì cả. Các chương trình được viết bằng ngôn ngữ chức năng chỉ có thể có đầu vào được cung cấp bởi bộ thực thi và tạo ra một đầu ra được báo cáo cho bộ thực thi mà không có bất kỳ phương thức không rõ ràng nào được xác định rõ ràng, nhưng đó là do bộ thực thi đang trừu tượng hóa tất cả các chi tiết không hoạt động này trong một hệ thống máy tính không hoàn hảo,
Nó chỉ đơn giản là một điều rất tốt để biết chức năng nào bạn đang sử dụng là thuần túy và chức năng nào không, để bạn có thể đưa ra quyết định tốt về cách sử dụng chúng. Các chức năng không tinh khiết, bởi vì chúng làm mọi thứ hoặc phụ thuộc vào những thứ không rõ ràng từ việc sử dụng của chúng, có thể hành xử không thể đoán trước chỉ có kiến thức về việc sử dụng. Kiến thức sâu hơn về mục đích của chức năng, và do đó, những gì nó cần từ hoặc làm cho trạng thái bên ngoài, được yêu cầu để đặt một hệ thống sử dụng nó ở trạng thái nhất quán và do đó để mong đợi một kết quả xác định.