Сьогодні () - це нечиста функція, оскільки її результат залежить від чогось, чого ви їй не надаєте; конкретно, поточний системний час. Тому його результат не є детермінованим, коли ґрунтується лише на входах, наданих при виклику.
Чиста функція була б int Add(int a, int b) {return a + b;}
. Функція працює виключно з тим, що їй задано, і не використовує ніяких інших зовнішніх даних про стан. Природним результатом цього є те, що ви можете Add(2,2)
отримати 4 з цього моменту до кінця часу. Крім того, оскільки функція не змінює жодного зовнішнього стану (у неї немає "побічних ефектів"), додавання () 2 і 2 з цього моменту до кінця часу не змінить нічого іншого в системі, якщо ви тоді призначити результат функції змінній або іншим чином використовувати значення для оновлення стану (що не є операцією, виконаною самою функцією). Практично всі класичні математичні операції є чистими функціями і можуть бути реалізовані як такі.
Сьогодні (), з іншого боку, може отримувати одне і те ж значення, коли дзвонять два рази поспіль, але не, якщо викликається повторно протягом декількох днів. Це відбувається тому, що це залежить від зовнішніх даних про стан, які не надані вами як параметр функції. Як результат, неможливо в межах програми контролювати результат функції Today (). Він видасть задане значення в даний день і ніколи не видасть це значення в будь-який інший день, якщо ви не зміните системний годинник комп'ютера, на якому він працює (зміна, як правило, відбувається за межами програми).
Нечиста функція не обов'язково є поганою справою; нечисті функції потрібні, навіть на функціональних мовах, для взаємодії з чим-небудь поза межами програми, наприклад, сховищами даних, трубопроводом зв'язку, дисплеями інтерфейсу, периферійними пристроями тощо. Програма, яка не робить жодного з цих речей, - це програма що різко обмежено у своїй корисності; Я б навіть пішов так далеко, щоб назвати таку програму тривіальною, оскільки без жодних засобів прийняти вклад чи будь-який проспект, щоб повідомити вам про її результати, це, можливо, нічого не робити. Програми, написані на функціональних мовах, можуть мати лише вхід, що надається під час виконання, і давати вихід, повідомлений під час виконання, без явно визначених нечистих методів, але це тому, що час виконання абстрагує всі ці нечисті деталі роботи в недосконалій комп'ютерній системі,
Просто дуже гарно знати, які функції, які ви використовуєте, є чистими, а які - ні, щоб ви могли добре приймати рішення про те, як вони використовуються. Нечисті функції, оскільки вони роблять речі або залежать від речей, які не видно з їх використання, можуть поводитись непередбачувано, даючи лише знання про використання. Подальше знання мети функції, а отже, чого вона потребує від зовнішнього стану, або необхідна для того, щоб перевести систему, яка використовує її, у послідовному стані і, таким чином, очікувати детермінованого результату.