Яка ваша найсильніша думка щодо функціонального програмування? [зачинено]


25

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

Яка ваша найсильніша думка щодо функціонального програмування?


5
LINQ? .NET делегати? DSL, як Mathematica?
Джон Харроп

5
До речі, термін "функціональне програмування" використовується різними людьми для позначення різних речей, тому вам потрібно уточнити, яке значення ви використовуєте.
Джон Харроп

2
Ви ніколи і ніколи не знайдете людей, кодивши які на вашій функціональній кодовій базі. Не чудове ділове рішення, що обмежує ваш талант.
Патрік Х'юз

Відповіді:


52

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


19
Зовсім. Чисте функціональне програмування НЕ підходить для дуже орієнтованих на державу програм. Ось чому мені подобаються гібридні мови, які вміють робити і те, і інше. Використовуйте функціональні парадигми для функціональних проблем, імперативні парадигми - для імперативних проблем.
Метт Оленік

8
Домовились! Держава є важливою частиною програмування. Ось чому навіть Haskell, певним чином, найчистіша з мов FP, дозволяє використовувати стан та IO - він просто виконує відмінність між кодом IO / змінним кодом стану та чистим кодом, що дуже приємно для тестування та простоти розуміння .
Білл

8
Ось чому я люблю Хаскелл. Це заохочує мінімізувати цей стаціонарний код. В OO я прагну писати багаторазовий, легкий для розуміння і простий код для тестування. Більшу частину часу я закінчую кодом, я б не писав багато іншого в Haskell.
LennyProgrammers

4
"він просто виконує відмінність між кодом IO / змінним кодом стану та чистим кодом, що дуже приємно для тестування". Ви навіть не можете надрукувати повідомлення про налагодження, не обійшовши системи типу або ввівши повзучі монади.
Джон Харроп

2
Імовірно, чиста функціональна програма залишила б світ повністю незмінним, запустивши його?
Мартін Бекетт

24

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

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

Одним із результатів є невдача для компромісів. Це призводить (серед іншого) до приблизно 10 000 мов та діалектів, які досить різні для роздратування, але лише рідко досить різні, щоб один мав справді значну перевагу перед іншими. Багато людей також дивляться на реальний світ і вирішують, що оскільки він не дуже добре відповідає функціональній моделі, це в основному просто неправильно і найкраще ігнорується.

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

Це призводить до низки проблем. Перш за все, вивчення "функціонального програмування" здебільшого має філософське значення. У більшості інших типів мов знання однієї мови певного жанру є суттєвою допомогою у вивченні іншого. Якщо мій проект використовує мову XI, зазвичай можна найняти когось, хто знає мову Y (але не X) досить безпечно. Що стосується функціональних мов, це набагато менш вірно. Ви, можливо, знаєте Ерланга досить добре, але все ж вважаєте монади Хаскелла абсолютно чужими та незрозумілими.

З'єднайте кількість мов з обмеженою переносимістю талантів між ними, і ви отримаєте потворну ситуацію: одна мова чи діалект майже неможливо сформувати "критичну масу", необхідну для того, щоб зробити її досить розумною. Це повільно змінюється, але це все ще дуже багато , як Linux стає домінуючою настільної ОС - щороку, люди приходять з переконливими аргументами , що в кінці кінців це буде рік - і так само , як людей , які передбачали , що кожен рік десятиліттями, вони знову помиляться. Це не означає, що це (або одне) ніколи не може відбутися - лише те, що досі були люди, які дивляться на прогнози і думають "ні, не в цьому році".


4
Можливо, було б більше схрещування між функціональними мовами, якби були більш функціональні мови.
Баррі Браун

5
Ви не можете бути "функціональними" без цієї чистоти. Коли ви переходите через лінію, вся концепція розпадається, і ви закінчуєтесь брудною, паралельною, стандартною мовою без жодних переваг.
Патрік Хьюз

7
Отже, ваша перша проблема полягає в тому, що функціональні мови недостатньо відрізняються, щоб мати перевагу один над одним, а ваша друга проблема полягає в тому, що вони занадто різні, щоб легко переходити між ними?
Тихон Єлвіс

2
Мені ця відповідь звучить як зухвала. Ваш аргумент був би набагато переконливішим, якби ви навели кілька прикладів.
Бенджамін Ходжсон

1
...roughly 10,000 languages and dialects that are enough different to annoy but only rarely enough different for one to have a truly significant advantage over the others...Ні, це звучить як усі ці процедурні висловлювання. Java, Scala, Kotlin, C ++, C #, Groovy, Cheddar, ES6, Ceylon, Python, список продовжується і продовжується - всі вони просто нудні ітерації C, які не вирішують справжніх питань. Ось моя думка щодо рентабельності, щоб доповнити цю відповідь рентом: D
кіт

17

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

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


9
+1, хоча іноді я відчуваю те саме, коли програмую на імперативних мовах високого рівня. Наприклад, чому для fsck мені потрібно зробити єдиний клас методів, який реалізує єдиний інтерфейс методу на Java, а не просто використовувати функцію вказівника, як у C?
dimimcha

14
Я б сказав, що це не те, що ти "не можеш потрапити під" цих абстракцій, а більше, що просто потрібно багато роботи. Ми звикли збирати банан і їсти його обов'язково мовою; Haskell (наприклад) змушує вас спочатку заповнити 20-сторінкову форму, тому що це пріоритетно гарантує, що жоден банан таємничо не з’їсться, коли ви його не шукали. Що допомагає, коли міркуєте про банани, але іноді ви просто голодні.
j_random_hacker

4
@dsimcha: це особливість Java, а не тенденція до імперативних мов високого рівня. Насправді, мови високого рівня, ймовірно, мають більшу функцію як об'єкт першого класу.
Мухаммед Алкароурі

3
Необхідність монадів у Хаскелл випливає не з функціональної чистоти, а з того, що побічні ефекти та лінива оцінка - це два чудових аромату, які НЕ чудово смакують разом. Монади змушують послідовно оцінювати. (Дійсно, їх слід назвати будівельниками обчислень чи іншим . "Монада" - хитра назва для когось, крім теоретика категорії.) І ви можете із задоволенням робити FP без (свідомо використовуючи) монадів!
Френк Шірар

4
Варто зазначити одне: враховуючи ці "інверсії абстракції", мова може бути більш обмеженою, але компілятор і час виконання мають більше гарантій щодо вашого коду і можуть зробити більше. Це так само, як збирання сміття - мовою gc ви не можете просто виділити простір (що може бути корисним), але взамін, час виконання може керувати всією вашою пам’яттю, потенційно ефективніше, ніж ви могли вручну. Те саме з функціональною чистотою.
Тихон Єлвіс

8

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


4
Це логічно обгрунтований момент, але його можна усунути, поставивши "остаточне речення питання ОП", "позначивши проблеми з програмуванням, з якими часто стикаєтесь". (Не має значення, що окремі читачі будуть стикатися з різними проблемами, якщо вони описують, що вони є.)
j_random_hacker

4

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

Це немислимо, і ви, мабуть, отримаєте більш високий рівень розробника, тому що javaschool grad без реальних навичок хакерства не знатиме, з чого почати проект такого типу, але обмежений пул спроможних розробників, безумовно, буде необхідною увагою з точки зору бізнесу.


2

Час на ринок

Складно позбутися повного ІТ-пейзажу процесуального кодексу та мантр.


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


2

Перш за все, я не приймаю жодного з аргументів щодо повноцінного програмування та fp. загляньте у державну монаду в haskell, і ви знайдете ряд нових цікавих способів оцінити вплив стану на ваш код.

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

я вважаю, що моя відповідь відображає мене як фан-фпі. Я пропоную надати справжній мові fp, як haskell, серйозний спін, перш ніж турбуватися про пошук причин, чому ви не повинні.


6
Я думаю, що ваш перший абзац описує саме те, що не так з розумом FP. Ми не хочемо "нових цікавих способів оцінити вплив стану на наш код". Що це навіть означає?!? Ми просто хочемо, щоб держава була там і була легкодоступною, тому що вона нам потрібна, щоб насправді це зробити.
Мейсон Уілер

2
У Camry, якою я їхав, є свої проблеми, але це не вимагає від мене постійно перевіряти під кришкою на предмет витоків місця . Haskell більше схожий на мову , який виглядає , як автомобіль F1, але не може на насправді робити високі обороти двигуна в протягом тривалого періоду часу. :-P
j_random_hacker

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

@brad clawsie: Я думаю, що вся проблема контролю побічних ефектів у FP може послужити зробити кодування набагато продуктивнішим: писати потрібно більше часу, але менше часу на виправлення. На жаль, спочатку потрібно докласти чимало зусиль для навчання, і багато програмістів не мають такого довгострокового мислення: все потрібно швидко зробити. Немає часу зробити це правильно з першого разу, але завжди є час налагодити і виправити це пізніше. :-)
Джорджіо

@Mason Wheeler: З функціональної точки зору наявність загального стану корисна лише для оптимізації: копіювання значень займає занадто багато часу та пам'яті, тому ви ділитесь об’єктом даних, щоб уникнути зайвого копіювання. Але застосування загального стану як правило з самого початку є своєрідною передчасною оптимізацією.
Джорджіо

2

Я великий фанат і прихильник функціонального програмування. Але ось мої моменти:

  • легко вивчити
    Мови програмування, такі як python та ruby ​​(та багато інших мов), легко вивчити. Розширене функціональне програмування з такими мовами, як Haskell, Agda, Coq, ATS тощо, досить важко вивчити. Деякі використовують термін "математичне структуроване програмування". Це легко, якщо ви знайомі з теорією категорій та абстрактною математикою, але досить добре працюєте, якщо у вас немає поняття, що таке "монади".

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

  • бізнес-міркування
    Програмування - це лише невеликий набір успішних програмних проектів. Програмне забезпечення має працювати, користувачі повинні бути задоволені, і це не обов'язково залежить від мови програмування, що використовується. Керівники повинні думати про переваги та ризик під час оцінки нових технологій та мов програмування. Чи можуть нові програмісти швидко засвоїти нову мову програмування? Чи є у компанії досвід роботи з технологією? Чи є ризик і чи важко буде це сперечатися з вищим керівництвом?

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

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


3
"Легкий у навчанні": Я не вважаю опанування Haskell важче, ніж оволодіння сучасним C ++. Я думаю, що ми прагнемо важко розглянути те, що нам не знайоме.
Джорджіо

1

Я не проти FP як корисної парадигми, але я проти цього як єдиної парадигми, доступної мовою програмування.

Він пропонує переваги у вирішенні багатьох проблем. Однак FP може бути і застосовується в процедурних мовах, таких як C.


Погодьтеся з першим реченням, не погоджуйтеся з другим. Ви в основному не можете обійтися FP без збору сміття.
dimimcha

Немає вимоги, щоб у мові виконання часу не було прозорого управління пам’яттю (зі збиранням сміття) для того, щоб відповідати «процедурній» мітці, тож іронічно ви таким чином сформулювали своє друге речення. BASIC - одна з таких мов.
Huperniketes

"Ви в основному не можете обійтися FP без збору сміття." - Чому?
Quant_dev

+1 Функціональне програмування на самому базовому рівні - це програмування без громадянства. Я не думаю, що існує мова, яка не може це зробити певною мірою. Я написав функції на C, C ++, Java, асемблері, C #, навіть Basic. Все, що потрібно, це те, що функція не має побічних ефектів або зберігає стан між викликами.
Майкл К

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

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

Функціонал з'явиться, коли у нас є сотні ядер і вдасться зрозуміти, що замки не змінюються. Тоді вкладені паралельні дані стануть єдиним способом перейти до «великих залізних» програм, і функціональні відмінності при цьому.


0

FP - це круто в академічних колах, тому що класно писати хороші короткі програми, ігноруючи продуктивність. Немає змови проти цього в реальному світі. Наприклад, наприклад, реалізація деяких речей (наприклад, сортування radix) здається загальним болем у FP. Ох і створений код IMHExperience sloooooooooooooooooooowow.


4
Так, це явно неправда. Код Haskell, як правило, нарівні з C і Java, і набагато швидше, ніж Python та друзі. Також зазвичай банально паралелізувати, що потенційно дає ще більше швидкості.
Тихон Єлвіс

0

У деяких крива навчання досить крута, забирає тривалий час (особливо якщо ви приїхали з ООП; ви будете бити головою кілька разів, перш ніж отримати зміну парадигми).

Навіть незважаючи на те, що я почав отримувати функціональне програмування (приїжджаючи з Java і переходячи до Clojure), мені все ще досить складно. Схоже, що спільнота не пише код настільки виразним, як Java.

Здається, є невелика втрата виразності та невелике збільшення складності.


Я думаю, що люди без попереднього досвіду програмування сказали б, що у OOP крутіша крива навчання, ніж у FP, оскільки FP ближче до Math. Я не розумію, що ви маєте на увазі під назвою "Спільнота, схоже, не пише так виразний, як Java", що ви думаєте?
Йонас

Я ніколи не чув, щоб функціональна мова втрачала виразність. Але тоді я ніколи не використовував менш виразну мову, ніж Java, тому, можливо, у мене є інше визначення "виразного".
гленатрон

@Jonas - через одну просту річ: скорочення імен для функцій, змінних тощо ... я маю на увазі, чому б не просто назвати речі для того, що вони є чи повинні робити? чому "pmap"?
Белун

1
@Belun: Це з функціональним програмуванням не має нічого спільного. Ви повинні звернутися до певної мови програмування. Карта - це функція, поширена у багатьох функціональних мовах програмування, і вона має хорошу назву . pmapна який ви посилаєтесь, може бути паралельним варіантом.
Йонас

я сказав: "Здається, громада не пише". це означає, що це те, що я пережив, і це відповідає спільноті, яку я спостерігав. це не має стосуватися всіх, хоча я сумніваюся в цьому. це має відношення до функціонального програмування, він схожий на його стиль
Belun

0

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

Єдиною сферою, в якій я маю серйозні сумніви щодо ефективності ПС, є те, як він може мати справу зі складними структурами даних, які не можна визначити індуктивно, наприклад, графіками. Наприклад, якщо мені доведеться реалізувати алгоритм, який працює над великим графіком, можливо, проходжуючи графік і вносячи невеликі локальні зміни, мені цікаво, чи підхід FP може відповідати імперативному підходу, в якому програмі дозволяється переміщатися з вузла до вузол за допомогою покажчиків.

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