Психічні моделі або метафори реального світу для функціонального програмування


16

Хтось має хорошу ментальну модель або метафору для функціонального програмування, яка посилається на щось у реальному світі?

Об'єктно-орієнтоване програмування інтуїтивно має для мене сенс. Є речі, які мають властивості, і іноді вони також можуть робити речі або робити розрахунки за своїми властивостями (методами). (Наприклад: Автомобіль, Форма, Кіт).

Я веду функціональне програмування, ні про що не буду, і мене не цікавлять дискусії про чесноти двох. Мені просто потрібна метафора чи ментальна модель, з якою я працюю, як у мене з об'єктно-орієнтованим програмуванням.

Які хороші ментальні моделі чи метафори реального світу для програмування у функціональній парадигмі? Існує щось про функції, що складаються з функцій обробки функцій, що залишає одну без твердого місця для стояння та співучасті.


Який конкретний зміст "функціонального програмування" ви маєте на увазі, "відсутність побічних ефектів / декларативність" або "першокласні функції / склад функцій"? Або обоє?
ацелент

Цікаве запитання. З моїми нині невеликими знаннями та малим досвідом програмування в "функціональному програмуванні" я не можу змістовно відповісти на це питання. Якби я загрожував здогадком, я б сказав і те, і інше.
Гвідо Ансельмі

13
Модель "реального світу" часто дається як мотивація об'єктно-орієнтованого програмування. Я думаю, що це підхід, який ви зрештою повинні перерости, тому що об'єкти в ООП не завжди повинні відповідати об'єктам реального світу, і навіть коли вони є, листування часто є неповним; наприклад, відносини "є-а" не завжди однакові. З іншого боку, як тільки ви говорите, що хочете модель або метафору для мови програмування, заснованої на чомусь у "реальному світі", я думаю, що ви по суті себе обмежили цією обмеженою формою ООП.
Девід К

Справді хороша ментальна модель, якщо у вас є досвід використання систем, подібних до Unix (або оболонки повноважень у сучасних Windows), є одноклапанні оболонки. Вони не зовсім однакові, оскільки корпусні труби - це технічно потокове програмування замість функціонального, але вони мають те саме "відчуття", що і програміст.
slebetman

1
Крім того, ви знайдете, вивчаючи функціональні мови, у функціональному програмуванні об'єктно-орієнтоване трактується як інструмент, наприклад, як регулярні вирази. Щось ви можете використовувати, якщо вам подобається, але не потрібно. У деяких мовах, таких як lisp і tcl і далі OO - це не функція, вбудована в мову, а бібліотека, якою ви можете користуватися (або ви навіть можете написати свій власний ОО, якщо ви відчуваєте себе сміливим). Тож проблеми, які, природно, мають рішення OO, можна вирішити, використовуючи ОО на більшості функціональних мов. Люди просто не ставляться до ОО як до релігії.
slebetman

Відповіді:


32

Функціональне програмування стосується склеювання менших функцій для досягнення ваших результатів. Гідна ментальна модель (як мінімум, для мене) - це конвеєр. Кожна складена функція - це ще один крок у процесі складання. Розглянемо цю функцію тут:

smallest  = head . sort

У Haskell ця функція поверне найменший елемент у списку. Складальний рядок спочатку сортує вхід, потім повертає перший елемент (припускаючи, що він відсортований найменше до найбільшого.) Якщо ми хотіли отримати лише найменше парне значення, то ми можемо змінити складальну лінію так, щоб виглядати наступним чином:

smallestEven = head . sort . filter even

Це лише ще один крок на конвеєрі.

Коротше кажучи, функції просто описують кроки, зроблені для перетворення необробленого входу (частин) у оброблюваний товар (вихід.)


2
У чистому функціональному мові, що не має глобальних змінних, тоді одна збірна лінія не може впливати на іншу (якщо вона не подає інший рядок.) Теоретично будь-які складальні лінії, які не залежать одна від одної, можуть виконуватися паралельно, але я не впевнений, чи роблять це будь-які компілятори.
bstamour

3
@GuidoAnselmi Один із способів думати про це - це те, що конвеєрна лінія у функціональному програмуванні створює нові виходи, залишаючи входи недоторканими, тоді як конвеєрна лінія в традиційному OOP перетворює вхід.
Doval

2
Ця метафора має сенс лише у «першокласному складі функцій / функцій», що означає «функціональне програмування», а не в «відсутність побічних ефектів / декларативне». Крім того, об'єктно-орієнтоване програмування не обов'язково має побічні ефекти, тому ви можете реалізувати або руйнівну, або конструктивну лінію складання або з OOP, або з цим значенням FP. OOP - це більше про інкапсуляцію, передачу повідомлень та поліморфізм, ніж про побічні ефекти, це залежить від того, як ви моделюєте речі. Наприклад, вам потрібна референтна ідентичність від початку до кінця?
ацелент

3
@bstamour: Якщо бути точним, слід написати це (f . g) (x)засіб f(g(x))чи f . gзасоби \x -> f (g (x)).
Джорджіо

3
@MarjanVenema У цьому прикладі залишені речі лише тому, що так .визначено; загалом це не так, як працює Haskell . Ви можете так само добре визначити оператора прямої труби F # ( |>) в Haskell і написати, smallest x = (sort x) |> headі дані будуть надходити правильно. Просто думав, що я це зазначу.
Довал

18

Хтось має хорошу ментальну модель для функціонального програмування?

Математика. Функціональне програмування надихається математикою та моделюється з неї. Математичні функції не мають стану, не мають побічних ефектів тощо, і так це з FP. Якщо ви думаєте про FP з точки зору математичних функцій, а не з використанням OO-стилю "як мені це зробити", ви будете в хорошій формі. Якщо ви спробуєте привнести чутливість OO до FP, проте ви будете плавати проти течії.


1
Спасибі. Однак мені потрібна метафора з реального світу (наприклад, не з комп’ютерів чи математики).
Гвідо Ансельмі

3
@GuidoAnselmi: Функція - це чорна скринька. Ви кладете щось в одну сторону, а потім щось нове виходить в іншу сторону. Якщо ви поміщаєте ті самі речі, ви завжди отримуєте ті самі речі. Ви можете взяти багато цих маленьких коробок і комбінувати їх у різних порядках, щоб побудувати завод, який може зайняти сировину та випустити машину. Всередині процес розбивається на багато шматочків, але зовні це лише інша функція.
Даеніт

16

Як щодо фліп-книги ?

У фліп-книзі кожна сторінка відображає світ, який існує в даний момент у часі. У нашій програмі світ представлений як складна структура даних (наприклад, у нас є банан, який знаходиться в руці горили, який знаходиться в дереві, яке знаходиться в джунглях). Кожна наступна сторінка просуває історію, трохи змінюючи попереднє уявлення. У FP стійкі структури даних були розроблені для ефективного використання попередніх структур, так що зміна забезпечує лише дельту, а не зовсім нове видання.

Що може бути не очевидним, це те, що сторінка нашої фліп-книги також буде представляти нематеріальні речі. Наприклад, якщо горила скидає банан, ми можемо почати застосовувати сили тяжіння на його пристойне і прискорення у напрямку дна джунглів. Для цього ми додамо такі банани, як швидкість та траєкторія.

У нашій програмі була б функція, яка приймає аргументовану сторінку книги (також стан світу) як аргумент і дає нову сторінку . Таким чином розповідається наша історія, не змінюючи фактично стан існуючих об'єктів. Ми просто замінюємо кожну сторінку новою, використовуючи те, що фактично є розрахунком.


3

Відносини.

Друг: Враховуючи двох людей, стосунки з друзями дотримуються цих загальних законів

  1. Майте добру волю один до одного
  2. Думає, що один до одного є для них другом (тому закони повинні виконувати обидва члени в цьому стосунку)
  3. Насолоджується проводити час один з одним

Моноїд: Враховуючи кілька елементів і функцію, яка займає 2 пункти і повертає 1, моноїдальне співвідношення слідує цим загальним законам

  1. Є один із цих елементів (лише один, званий ідентичність), який перейшов до функції з будь-яким іншим елементом, забезпечить функцію завжди повертає інший елемент (0 + 1 = 1, таким чином 0 - тотожність, коли елементи є числами і функція є доповненням)
  2. Функція не може працювати або повертати предмети, не в тому наборі, з яким вона має моноїдний зв'язок
  3. Функція асоціативна і може використовуватися з елементами дещо незалежним чином, це означає a (b * c) = (a * b) * c, що говорить, що ви можете помножити a на результат b * c або c в результаті a * b і результат буде таким самим, що ви зробите першим.

Функціональне програмування стосується узагальнень, друг - це дуже загальне співвідношення, яке можна побачити у численних сценаріях, але у всіх різних форматах воно, як правило, відповідає вищезазначеним законам.

Визнаючи закони, що регулюють відносини між речами, ви можете створити загальні реалізації, які працюють на будь-якому форматі речей, що мають такий тип відносин. У функціональному програмуванні ви намагаєтеся визначити взаємозв'язки між речами, щоб їх можна було класифікувати та трактувати загалом.

Ви хочете метафору з реального світу? Подивіться, як пов’язані речі, і спробуйте визначити загальні закони (як це стосується багатьох сценаріїв, коли речі, окрім законів, можуть відрізнятися). Існує зв'язок між реєстратором і покупцем у магазині, у ньому є деякі загальні закони, розроблено програмне забезпечення для полегшення цілей людей у ​​цих загальних стосунках у спосіб POS-систем. Аналогічно, коли ви починаєте бачити ці загальні закони, що диктують, як пов'язані між собою речі, ви можете почати покладатися на закони цих відносин у написанні свого програмного забезпечення, а не на конкретні деталі примірника відносин.


2

Все є цінністю, і ви застосовуєте функції до значень (які можуть бути функції) для створення нових значень, бажано, не створюючи жодних побічних ефектів.


Спасибі. На жаль, це звучить більше як опис, ніж ментальна модель чи метафора. Мені потрібна метафора з реального світу (а не від комп’ютерів).
Гвідо Ансельмі

1
Як зазначає Калеб , функціональне програмування моделює математику, а не реальний світ. Він може моделювати реальний світ за допомогою об'єктива математики, але ви, швидше за все, не знайдете метафору, яка вас задовольняє, оскільки Ф.П. уникає концепції речей зі стійкою ідентичністю та змінним станом. Якщо вам подобається, я можу зазначити, як OOP будує карту на FP, але це все одно не буде відповіддю, яке ви хочете.
Doval

Але математика базується на реальному світі. 1 сонце, 9 планет. 2 яблука плюс 2 яблука робить чотири яблука.
Гідо Ансельмі

А у функціональному програмуванні ви також можете мати тип для сонця, планет та яблук, а потім створити одне значення типу сонця, 9 значень типу планети та визначити додавання для типу яблука.
Довал

3
@GuidoAnselmi у вас це повністю відсторонено, люди аналізують реальний світ математикою, у нього немає підстав на реальному світі. Математика використовується для аналізу та визначення взаємозв'язків між різними речами, реальними та ні. 9 планет - це ви застосовуєте математичну конструкцію (набір натуральних чисел) до конструкції реального світу (планет) з функцією математичного аналізу (підрахунок). У реальному світі немає 9 планет, він має те, що він має, математика просто говорить про символічні уявлення речей, у яких символи мають стосунки між іншими.
Джиммі Хоффа

1

Ключове, що слід розуміти про функціональне програмування, - це те, що все є цінністю - навіть сам код є «значеннями».

Найкращий приклад простого функціонального середовища програмування - це улюблений для всіх бізнес-інструмент - електронна таблиця. Кожна комірка електронної таблиці є або даними, або результатом функції. Більше того, ця функція не може вимкнутись та змінити іншу комірку.

Коли один переміщається на функціональних мови, а не декартова сітка з A1і B42функції мають імена. Ось все це насправді є.

Є й інші аспекти, які можна додати поза цим ... але це суть функціонального програмування. Не потрібно турбуватися про структуру списків або групування речей. Функціональне програмування - це передача значення у функцію та повернення значення назад, не маючи якихось інших записів у пам'яті.

Це воно. Функціональне програмування - це електронна таблиця з іменами, а не сіткою.


0

Ви можете думати про функціональне програмування як про поведінку . Програма - це опис поведінки, яку ви бажаєте виконати на комп’ютері. Функції - це основна одиниця поведінки, а композиція функцій - це один із способів побудови більшої поведінки з менших.

В ООП, об'єкт - код призначений для бути станом об'єкта в проблемній області; вона змінюється з часом, щоб відображати зміни в цьому об’єкті домену. У FP значення представляє стан об'єкта домену; це ніколи не змінюється, ви просто створюєте різні значення для представлення різних станів.

Я вважаю функціональну модель дещо чеснішою щодо того, якими комп’ютерами насправді займаються - представляючи. Зрештою, я не можу просто побачити new Tesla()з повітря. :)


-5

Речення є більш функціональними, ніж об’єктно-орієнтовані, якщо припустити, що ви розбиваєте їх більш-менш, як у наступному ...

The brown cow is in the meadow across the deep river.

Тому нам потрібно знайти головні фрази, а потім все інше:

The cow (brown)
the meadow (across)
the river (deep)

За один раз:

sentence: The cow ((the meadow (the river (deep)) (across)) brown)

Розбір дерева:

|                     sentence
|                      /         
|                  The cow
|                 /       \
|            the meadow   brown
|            /         \
|      the river      across
|              \
|              deep

Парсизм заражає функціональне мислення;

Шапки на Готліб Фреге 1890-х, Алан Тьюрінг (entschiedungsprobleme) 1930-х, Ноам Хомський (1960-ті).


4
Це заплутане пояснення, і я знайомий з FP для початку.
Даеніт

Схоже, наслідуючи форму Лісп, не розуміючи сенсу,
Ізката
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.