Насправді OO-код набагато менш використаний, і це за дизайном. Ідея OOP полягає в обмеженні операцій над певними фрагментами даних певним привілейованим кодом, який знаходиться або в класі, або у відповідному місці в ієрархії спадкування. Це обмежує несприятливі наслідки змінності. Якщо структура даних змінюється, у коді є лише стільки місць, які можуть відповідати.
Завдяки незмінності вам не байдуже, хто може оперувати будь-якою структурою даних, оскільки ніхто не може змінити вашу копію даних. Це значно спрощує створення нових функцій для роботи над існуючими структурами даних. Ви просто створите функції та згрупуєте їх у модулі, які здаються доцільними з точки зору домену. Вам не потрібно турбуватися про те, де їх вписати в ієрархію спадкування.
Інший вид повторного використання коду - це створення нових структур даних для роботи над існуючими функціями. Це обробляється на функціональних мовах за допомогою функцій, таких як дженерики та класи типів. Наприклад, клас типу Orke Haskell дозволяє використовувати sortфункцію будь-якого типу з Ordекземпляром. Екземпляри легко створити, якщо вони ще не існують.
Візьміть свій Animalприклад і розгляньте можливість використання функції годування. Безпосередня реалізація OOP полягає у підтримці колекції Animalоб'єктів та проходженні їх через усі, викликаючи feedметод на кожному з них.
Однак, справи стають складними, коли ви переходите до деталей. AnimalОб'єкт природно знає , яку їжу він їсть, і скільки це необхідно для того , щоб відчувати себе повністю. Це, природно, не знає, де зберігається їжа та скільки є, тому FoodStoreоб’єкт просто став залежністю кожного Animal, чи то як поле Animalоб’єкта, чи передається як параметр feedметоду. Крім того, щоб зберегти Animalклас більш згуртованим, ви можете перейти feed(animal)до FoodStoreоб'єкта, або ви можете створити огиду класу, який називається тим AnimalFeederчи іншим .
У FP немає схильності поля Animalзавжди залишатися згрупованими разом, що має деякі цікаві наслідки для повторного використання. Скажімо , у вас є список Animalзаписів, з такими областями , як name, species, location, food type, food amountі т.д. У вас також є список FoodStoreзаписів з полями , як location, food typeі food amount.
Першим кроком у годівлі може бути зіставлення кожного з цих списків записів до списків (food amount, food type)пар із негативними цифрами для кількості тварин. Потім ви можете створити функції, щоб робити всілякі речі з цими парами, як, наприклад, підсумовувати кількість продуктів кожного типу. Ці функції не належать до абсолютно або Animalабо в FoodStoreмодулі, але вельми багаторазові обома.
У вас з'явилася купа функцій, які роблять корисні речі [(Num A, Eq B)]для багаторазового використання та модульної роботи, але у вас виникають труднощі з розумінням, куди їх розмістити або як назвати їх як групу. Ефект полягає в тому, що модулі FP важче класифікувати, але класифікація набагато менш важлива.