Простіше кажучи, обмеження означають, що існує менше правильних способів складання речей, а функції першого класу полегшують розподіл речей, таких як петлеві структури. Візьміть цикл з цієї відповіді , наприклад:
for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
String string = iterator.next();
if (string.isEmpty()) {
iterator.remove();
}
}
Це, можливо, є єдиним безпечним необхідним способом у Java видалити елемент із колекції, поки ви повторюєте його. Є маса способів, які виглядають дуже близько, але помиляються. Люди, які не знають про цей метод, іноді переживають складні способи уникнення проблеми, як-от повторення копії.
Це не дуже важко зробити цей загальний, тому він буде працювати над більш ніж просто колекціями Strings, але без першокласних функцій ви не можете замінити предикат (умова всередині if), тому цей код має тенденцію до копіювання та вставлення і трохи змінені.
Поєднайте функції першого класу, які дають вам можливість передавати присудок як параметр, з обмеженням незмінності, що робить його дуже прикро, якщо ви цього не робите, і ви придумуєте прості будівельні блоки filter, як у цьому коді Scala це робить те саме:
list filter (!_.isEmpty)
Тепер подумайте, що система типів перевіряє для вас під час компіляції у випадку Scala, але ці перевірки також робляться системами динамічного типу під час першого запуску:
listповинен бути якийсь тип, який підтримує filterметод, а саме колекцію.
- Елементи
listmust повинні мати isEmptyметод, який повертає булеву форму.
- Вихід буде (потенційно) меншою колекцією з однотипними елементами.
Після того, як ці речі були перевірені, які інші способи залишаються програмісту накрутити? Я випадково забув !, що спричинило надзвичайно очевидний збій тестового випадку. Це майже єдина помилка, яку я можу зробити, і я зробив це лише тому, що безпосередньо перекладав з коду, який перевіряв на зворотний стан.
Ця закономірність повторюється знову і знову. Функції першого класу дозволяють вам переробляти речі на невеликі утиліти для багаторазового використання з чіткою семантикою, такі обмеження, як незмінність, дають поштовх до цього, а перевірка параметрів цих утиліт залишає мало місця для їх викручування.
Звичайно, все це залежить від того, що програміст знає, що спрощувальна функція, як filterуже існує, і вміння її знайти, або визнаючи вигоду від створення себе. Спробуйте реалізувати це самостійно скрізь, використовуючи лише хвостові рекурсії, і ви знову в тому ж складному човні, що і імперативна версія, тільки гірше. Тільки тому, що ви можете написати це дуже просто, не означає, що проста версія очевидна.