В даному розділі вводяться основні поняття і термінологія чистих функціональних перетворень. Підхід з використанням функціональних перетворень для перетворення даних породжує код, який зазвичай швидше для програмування, більш виразний і легше для налагодження і супроводу, ніж породжений з використанням традиційного імперативного програмування.
Зауважимо, що теми в даному розділі не претендують на докладне пояснення функціонального програмування. Але при цьому вони визначають деякі можливості функціонального програмування, які дозволяють легше переводити XML з однієї форми в іншу.
У розділі чисто функціональне перетворення визначається набором функцій, які називаються чисті функції. дозволяють перетворити набір структурованих даних з однієї форми в іншу. Слово «чисті» вказує на те, що функції допускають композицію. яка вимагає, щоб вони були такі.
Замкнені. тобто вони повинні бути вільно впорядковані і змінити таким чином без залучення інших частин програми і взаємних залежностей від них. Чисті перетворення не мають уявлення про своєму середовищі і не впливають на неї. Іншими словами, використані при перетворенні функції не мають побічних ефектів.
Без збереження стану. тобто виконання однієї і тієї ж функції або певного набору функцій з однаковими вхідними даними буде завжди приводити до однакових вихідних даних. Чисті перетворення не знають про попередні використань.
До кінця цього підручника термін «чиста функція» використовується в основному для вказівки підходу до програмування, а не спеціальної характеристики мови.
Відзначимо, що чисті функції повинні бути реалізовані як методи в мові C # і як функції в мові Visual Basic. (В Visual Basic підпрограми не можуть повертати значення і тому не використовуються для написання чисто функціональних перетворень.)
Також не треба плутати чисті функції з чисто віртуальними методами в C ++. Другий випадок показує, що міститься клас абстрактний і текст методу не вказано.
функціональне програмування
Термін функціональне програмування позначає такий підхід до програмування, при якому безпосередньо підтримуються чисто функціональні перетворення.
Історично мови функціонального програмування загального призначення, такі як ML, Scheme, Haskell і F # (розроблений Microsoft Research), становили основний інтерес вченого співтовариства. Не дивлячись на те що завжди було можливо писати чисто функціональні перетворення на мовах C # і Visual Basic, це не стало привабливим варіантом для більшості програмістів через свою складність. В C # 3.0 і Visual Basic 9.0, проте, нові конструкції мови, такі як лямбда-вирази і визначення типів, зробили функціональне програмування набагато легшим і більш продуктивним.
Додаткові відомості про функціональне програмуванні див. Розділ Порівняння функціонального і імперативного програмування.
Предметні мови функціонального програмування
Не дивлячись на те що основні мови функціонального програмування широко не використовуються, спеціальні предметні мови функціонального програмування мають більший успіх. Наприклад, каскадні таблиці стилів (CSS) використовуються для визначення виду багатьох веб-сторінок, а перетворення XSLT широко використовуються в обробці XML-даних. Додаткові відомості про XSLT см. В розділі Перетворення XSLT.
Наступні таблиці визначають деякі терміни, пов'язані з функціональними перетвореннями.
функція вищого порядку (першого класу)
Функція, яка може бути інтерпретована як програмний об'єкт. Наприклад, функція високого порядку може бути передана і повернута іншими функціями. У мовах C # і Visual Basic вираження-делегати і лямбда-вирази є компонентами мови, які підтримують функції вищого порядку. Для написання функції вищого порядку необхідно оголосити один або кілька аргументів для прийняття делегатів, при цьому зазвичай використовуються лямбда-вирази. Багато стандартні оператори запиту є функціями високого порядку.
По суті це вбудована анонімна функція, яка може використовуватися, коли тип делегата невідомий. Це спрощене значення лямбда-виразів, проте воно досить для цілей даного підручника.
Структурований набір даних зазвичай стандартного типу. Для забезпечення сумісності з LINQ колекція повинна реалізовувати інтерфейс IEnumerable або інтерфейс IQueryable (або один з їхніх основних прототипів IEnumerator
кортеж (анонімні типи)
Як математичне поняття, кортеж є кінцевою послідовність об'єктів, кожен певного типу. Кортеж називається також впорядкованим списком. Анонімні типи є мовну реалізацію цієї концепції, яка дозволяє оголосити клас неіменованого типу і одночасно створити екземпляр об'єкта цього типу.
визначення типів (приховане тіпізірованія)
Можливість компілятора визначити тип змінної при відсутності явної декларації типу.
відкладене виконання і неспішні обчислення
Затримка обчислення виразу до тих пір, поки його результат не стане потрібен. У колекціях підтримується відкладене виконання.
Ці мовні можливості будуть використані в зразках коду протягом даного розділу.