Впровадження функціонального програмування у ваше середовище розробки [закрито]


15

Це довга історія, але я спробую підсумувати її якнайкраще. Ми - магазин .NET, який пише програмне забезпечення для різноманітних фондів. Наприклад, ми пишемо програмне забезпечення для управління претензіями на здоров'я, програмне забезпечення для управління пенсіями, програмне забезпечення 401 (k) та деякі інші речі фінансового типу.

Зараз ми входимо в нову сферу: похідні та кількісні аналітичні роботи, що здається дуже захоплюючим. Це те, що знижується в наступні 8-12 місяців, про які мені говорили.

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

Моє запитання - з чого почати? У мене надзвичайно важкий час, намагаючись розібратися, чи варто мені їхати з Haskell, Erlang, Scala, F # і т. Д. Вони всі здаються дуже цікавими та здібними, і, відверто кажучи, це може бути хорошим шансом вийти з настільки залежних від Microsoft.

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


рекомендуємо прочитати: З чого почати
gnat

Відповіді:


14

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


Хороша порада, і я її прислухаюсь, адже я зараз роблю встановлення Erlang, щоб дати йому піти.
Nodey The Node Guy

10

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

Якщо ви справді відчуваєте, що вам потрібна функціональна мова для вирішення певної проблеми, і якщо припустити, що більшість основних функціональних мов відповідатиме вашим вимогам, то я б підходив до найзрілішої та тієї, яка має найбільшу спільноту користувачів. Erlang - це вдалий вибір, який відповідає обом цим вимогам, однак у чистому середовищі ms / .NET я можу зрозуміти, використовуючи F #.


2
@ennukiller - Я точно можу побачити, що функціональне програмування було б для нас хорошим вибором, і я не збираюся брехати - я також хотів би використовувати його лише для того, щоб воно було інтелектуальним стимулюванням. Ми будемо робити велику кількість обчислень, і я хочу скористатися багатоядерними. Крім того, обов'язково, щоб кожна математична функція була перевірена правильною, я розумію, що це може бути простіше з функціоналом.
Nodey The Node Guy

2
Якщо вам потрібні докази, найкраще чисте функціональне програмування. Деякі пропозиції тут стосуються функціональних додатків до імперативних мов - вони можуть бути більш звичними, але не дадуть вам коректно правильного коду. За наявності побічних ефектів, ви не можете використовувати той факт, що x = x ("референтна прозорість"), і вам доведеться довести, що пізніше x у коді все ще має те саме значення, що і раніше. Наприклад, у деяких мовах може статися так, що x:=3; y:=10; x:=add(x,x);результат, xякий не є 6, а yякий не є 10. Доводити свої функції правильними в цьому контексті, недоцільно.
AndrewC

9

Я повністю погоджуюся з F # для магазину з існуючою базою коду .Net, наскільки я б повністю погоджувався зі Scala для магазину з існуючою базою кодів Java.

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


7

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

Звичайно, мови, спеціально розроблені для функціонального програмування, матимуть деякі переваги (наприклад, мати конкретні конструкції, такі як розуміння та робити структури даних незмінними за замовчуванням), але в цілому найбільшим кроком потрібно змінити своє мислення на функціональне стиль. C # чудово підходить для цього.

По суті, ви просто перестаєте змінювати стан свого коду. Я робив це за допомогою Java, і це навіть простіше з C #, тому що у вас лямбда. Після того, як ви отримаєте звичку цього стилю та відчуєте, для чого це добре, ви зможете підібрати функціональну мову (незалежно від того, чи ви вибрали F # чи Erlang), і будете надзвичайно продуктивні з цим.


1
+1: Я з вами згоден. Я також почав кодувати в більш функціональному стилі на Java і C ++ (використовуючи більш кінцеві і const змінні, розбиваючи складні операції з використанням функції функцій тощо). Я думаю, що це, безумовно, покращило мій стиль програмування на Java та C ++. Через деякий час, коли ви відчуваєте готовність піти далі, можна спробувати функціональну мову (Haskell, Ocaml, SML, Lisp, Scala, F # та ін.)
Джорджіо,

1

Якщо все, що вам потрібно, це вивчити та зрозуміти функціональне програмування, тоді просто встановіть IronPython і зосередитесь на функціональних функціях Python. У гіршому випадку ви дізнаєтесь інструмент, який можна інтегрувати з C #, щоб зменшити кількість рядків коду в додатку та допомогти вам доставити більше помилок продуктів достроково.

Перегляньте презентації DaBeaz про генератори на прикладі того, як функціональні підходи в Python можуть спростити складні речі http://www.dabeaz.com/generators/

Крім цього, я думаю, що вам було б розумно вкласти час зі Scala. Він працює в .NET в бета-режимі, тому ви можете встановити його та використовувати його сьогодні для навчальних цілей, а до осені він буде в режимі випуску для .NET. Це означає, що ви можете писати код у Scala, який переноситься через JVM та .NET. Оскільки Scala базується на "Акторах" та передачі повідомлень, дуже легко дуже легко створити додаток, виготовлене з декількох окремих програм, що працюють на декількох окремих машинах. Коли ви додаєте портативність .NET / JVM до суміші, слід врахувати ще один аспект. У вас може бути одна програма, яка використовує як сторонні бібліотеки Java, так і сторонні бібліотеки .NET, не поспішаючи розробляти протоколи, щоб змусити їх спілкуватися. Обидва процеси будуть записані в Scala, і використовуватиме віддалене обмін повідомленнями Scala (віддалені актори) для спілкування. Ознайомтеся з бібліотекою Akka, яка, схоже, з часом стане частиною стандартної бібліотеки Scala, судячи з того, що типовий сайт робить.


+1: Згадайте про Scala та її доступність на різних платформах. Питання: чи замінить akka поточну реалізацію актора у Scala? Або вони будуть існувати пліч-о-пліч?
Джорджіо

Не впевнений, чи скоро Акка замінить нинішніх акторів Scala, але творець Scala Мартін Одерський приєднався до творця Akka Йонаса Бонера в компанії Typesafe. Вони активно просувають Scala разом з Akka, а тепер і в рамках Play. Тож цілком ймовірно, що в центрі уваги розвитку буде акка. Якщо ви просто навчаєтесь акторам зі Скалою, найкраще спершу зосередитись на Акці.
Майкл Діллон

Дякую за інформацію! Я подивився на акторів Scala, але лише дуже поверхневий.
Джорджо

-1

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

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

Щоб спробувати утримати себе над завданням, ось моє розуміння поштовхів, заданих в ОП; Я буду доводити сторону до мінімуму в міру необхідності, щоб пояснити ....

Спочатку швидкі відповіді:

я був у подібній ситуації? Це було принаймні схоже; Я був на керівній посаді, роблячи багато різноманітних проектів, які, тим не менш, були пов'язані ... (CRM / Web / DB / Integration Data / тощо).

як / чому я зробив перехід до функціональності? " Я побачив кілька прикладів LINQ, і хоча я, безумовно, мріяв про якусь інтегровану, статично типовану мову запитів [як я в основному використовував статично введені мови (насамперед C ++, а пізніше C # )] Протягом усієї моєї кар'єри ... Але в мене було досить швидке вогневе середовище, і хоча мені часто вдавалося бачити, що відбувається в минулому, я ніколи не думав це, тому я ніколи не передбачив, що це могла б / дозволила б операції над Простіми Старими Об'єктами (кохаю!) так само легко; коли я побачила це, я зрозуміла, що мені доведеться це мати ... Отже, ось чому і початок роботи: я зосередився на тому, щоб навчитися розуміти LINQ .

Чотири думки ... помилково, ні, це неправильно ... Думки

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

Мене майже повністю ґрунтували на мовах статичного типу + метафори та шаблони OOP + все, що я закінчив, обернувши мозок навколо випадково, вирішуючи мої фактичні проблеми протягом багатьох років ... Справа в тому, що, якщо ти зовсім такий, як я, у вас, ймовірно, є багато мозку, присвяченого речам, які не допоможуть вам так сильно з LINQ / FP.

Я думаю, що це щось на зразок чистого процесуального проти програмування OO: є багато процедурних речей, які ви в кінцевому підсумку використовуєте в OOP, але ті, хто приходить на C ++ з C, не роблячи пріоритетним способом grok / ken / "get" OO врешті-решт, це дуже погано на C ++. Я на насправді опитав біса багато (15+) довгий час прошивки і розробники драйверів пристроїв , які дійсно думали , що вони знали , C ++, але хто, в найбільш , були дуже базовим / підручник розуміння C ++, з практично немає розуміння або досвід роботи в OOP - тому що вони ніколи насправді не робили OOP ... Вони писали однотонні багатоцільові класи зі статичними членами та статичними функціями з деякою кількістю класів нестатичних / не синглетонних, які використовувались як структури.

І FP має подібні згинальні (як і для тих, хто не парадигма) понять та інші речі, які йдуть разом із цим, і (хоча я вважав, що гібридизація багатьох методів є ідеальною для мене), я все більше розумію і тим більше, що час триває, наскільки обмежене було моє мислення до отримання реальних функціональних здібностей до мого набору інструментів; Мені в минулому вдалося реалізувати багато речей таким чином, який був дещо креативнішим, ніж, можливо, більшість програм-програмістів, але, коли я використовую ті концепції, наскільки моє мислення було попереднім ... Є цілі класи проблем, які можна вирішити в декількох рядках, які використовували певний перекрут, який можна зробити в C ++ / C #.

раптом ти опиняєшся ...

У "Занадто довгому" дописі

Ви перебуваєте в лабіринті закрученого "не читали", все так.

Ви бачите телеконференцію найближчим часом, що швидко наближається.
> короткий
Угу. Звичайно. Гаразд, ми скажемо, що "короткий" режим "увімкнено".

Ви бачите телеконференцію найближчим часом, що швидко наближається.
> що це повинно означати?
Просто говорю'. Вам не довелося щось робити сьогодні вранці?

Ви бачите телеконференцію найближчим часом, що швидко наближається. 
> Гей, це грю за тобою?
Що!? ДЕ ?! [тікає кричати]

> Вибачте, я не зрозумів, ЩО ДЕ, перефразовувати?
[продовжував бігати і кричати, сарказм непомітно]

Отже ... Що я повинен навчитися, шановний PSE, дорогий PSE?

Я особисто починав у C # з LINQ. Це дозволило мені вводити декілька понять одночасно, і, коли я постійно читав про ПП та її концепції, і більше LINQ, і про стосунки між ними, це дало мені шлях вперед, продовжуючи займатися продуктивною роботою. Я додав декілька речей за раз, запити даних швидко стали корисним інструментом для мене, не розуміючи тонни.

Тепер, озираючись на це, я хотів би спочатку зробити свій наступний проект (вирішений приблизно через рік); Я помірковано ознайомився з F # (що, до речі, дало мені великий початок вивченню ML (метамовлення) та інших похідних (наприклад, OCaml .)

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

По-перше, що пливе ваш човен? Тим більше, що спочатку найкраще мати щось цікаве та захоплююче (для вас), і це дозволить зберегти ваш інтерес достатньо, щоб зробити це вартим для вас. Отже, проблеми з IOW, над якими працювати, і методи, які вирішують ці проблеми ... LINQ та вбудовані запити даних для мене спочатку. Для мене була ще одна рекурсія, включаючи рекурсію хвоста, я копав її GodelEscherBach -ness; і я читав про рекурсію хвоста. Приблизно в цей час речі, над якими я працював, були призупинені, і в мене закінчився великий проміжок часу, тому я міг довго тримати його. Простіше було з меншими перервами, але, оскільки я вибирав речі, які, як я вважав, веселими, не все було так важко навіть з перервою в роботі. :)

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

І ... З чим я це навчусь, шановний PSE, дорогий PSE, з чим?

Для цього я використовував різні алгоритми, які мене так чи інакше зацікавили, а також різні речі, які я цікавив, чи можна в F #, і коли мені не вистачить ідей, я б вирішив такі речі, як 99 пляшок пива та Project Euler проблеми ...

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

Але ... У моїй моделі є дірка, дорогий PSE, отвір ...

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

І весь цей час ви повинні напружувати свій мозок, щоб зрозуміти це все, не зі своєї старої точки зору, а всередині самої ПП ... У якийсь момент для мене це натиснуло, і ... річ, яку я найкраще можу пов'язати з цим стає все більш-менш вільною мовою голландської мови; в якийсь момент мені вдалося вкласти себе в розум (я це робив зануренням, що в основному те, що я тут описав; занурившись у FP, а не намагаючись навчитися цьому виключно за допомогою "книги larnin" ...

І, врешті-решт, я і зробив; Мені вдалося інтерналізувати все і крутити мозок навколо, поки не почав з'являтися FP / LINQ, не будучи мені навіть докладати зусиль, щоб перекласти його назад в OOP. (Так, я це зробив; мені потрібно було щось повісити спідницю. Капелюх. Що б там не було.)

Заключні думки ...

Моє, моє, здається, ти втрачаєш здатність думати про свій підпис розумно
заголовки розділів. Який сором.

Телеконференція все ще швидко наближається. Зараз вона виявляється значно більшою.
> так, так, добре .. лад і все. Я бачу, вам вдалося втратити цю гру.
 закритий дзвінок, що ... ну, так, я буду тер ... О, НЕ ЗАРАЗ!
AAAAAAAHHHHHH !! [знову біжить кричавши, ще раз]

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

Ви, природно, можете знайти багато інформації в Інтернеті про FP. Головне - зрозуміти основні поняття, а потім навчитися їх застосовувати. Наприклад, дізнайтеся про незмінність і чому це важливо / корисно для FP. Я настійно рекомендую вивчити трохи теорії, щоб разом з усім, як, наприклад, чистий ПП може бути набагато прихильнішим до формального підтвердження. Це було рушійною силою для родоначальника F #, ML. YMMV, звичайно, вам може бути комусь нудно до сліз, в такому випадку багато прикладів, багато спроб і помилок, щоб точно зрозуміти, чому використовувані методи є такими, якими вони є, допоможуть вам мати те, що "Ага!" момент лампочки.

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

<3 "Представляємо GRUEBOL, зупинку; до тих пір, поки SnozzML не закінчиться. Це має бути скоро; я отримав величезний комітет, який допомагає мені цього разу." - Грейс Хоппервіт Егхед, відомі останні слова , XX97 GUE <3


що таке "дорогий SO"?
гнат

був дорогий стек переповнення; повинна відповідати каденції пісні "Там A Hole in the Bucket" xD
shelleybutterfly

Якщо розміщено поза межами SO, це, здається, ускладнить розуміння ваших пунктів - розглянути питання про редагування для цього
gnat

дерп! так, зробили. тивм. :)
shelleybutterfly

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