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


15

Это длинная история, но я постараюсь обобщить ее как можно лучше. Мы являемся магазином .NET, который пишет программное обеспечение для различных типов фондов. Например, мы пишем программное обеспечение для управления претензиями в области здравоохранения, программное обеспечение для управления пенсиями, программное обеспечение 401 (k) и некоторые другие вещи финансового типа.

Сейчас мы входим в новую сферу: производные и количественный анализ, тип работы, который кажется очень интересным. Это то, что происходит в следующие 8-12 месяцев, мне сказали.

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

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

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


рекомендуемое прочтение: с чего начать
комнат

Ответы:


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, а a yне равен 10. Доказывать правильность ваших функций в этом контексте нецелесообразно.
AndrewC

9

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

Функциональное программирование - это инструмент, как и любой другой. Хорошо использованный и интегрированный с тем, как вы уже разрабатываете код, он может сделать вас более продуктивным, упрощая рассуждения о том, что делает ваш код. Однако переключение языков далеко не бесплатно, поэтому лучшим выбором будет решение, которое позволит вам использовать как можно большую часть существующего кода как можно дольше для перехода. В конце концов, самый надежный способ не внедрить новый язык в вашу среду - это сказать своим коллегам, что им нужно переписать все, что у них есть, чтобы увидеть преимущества изменений, которые на данный момент Вы все еще пытаетесь продать их.


7

Я бы порекомендовал начать функциональное программирование, не изучая при этом новый язык. Это только усложняет задачу, если вы пытаетесь выучить новую парадигму, когда вы также пытаетесь разобраться с синтаксисом нового языка.

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

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


1
+1: я согласен с тобой. Я также начал кодировать в более функциональном стиле на Java и C ++ (используя более заключительные и константные переменные, разбивая сложные операции с использованием композиции функций и т. Д.). Я думаю, что это определенно улучшило мой стиль программирования в 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, судя по тому, что делает Typesafe.com.


+1: за упоминание Scala и его доступности на разных платформах. Вопрос: akka заменит текущую реализацию актера в Scala? Или они будут существовать рядом?
Джорджио

Не уверен, что Akka заменит действующих актеров Scala в ближайшее время, но создатель Scala Мартин Одерский присоединился к создателю Akka Джонасу Бонеру в компании Typesafe. Они активно продвигают Scala с Akka, а теперь и с фреймворком Play. Так что, скорее всего, основное внимание будет уделено Акке. Если вы только учите актеров со Scala, лучше сначала сосредоточиться на Akka.
Майкл Диллон

Большое спасибо за информацию! Я посмотрел на актеров в Scala, но до сих пор был очень поверхностным.
Джорджио

-1

Я, конечно, согласен с основным смыслом принятого ответа, и, учитывая, что вы в основном погружаетесь в вещи, пытаясь дать Эрлангу попытку, похоже, у вас, скорее всего, достаточно хорошее понимание того, как вы учитесь, и просто нужно немного подтолкнуть в правильном направлении. направление, так ясно, что это был хороший ответ для вас ... Но, я думаю, я бы подошел к этому вопросу немного по-другому, так как я вижу, что этот ответ не помог бы мне совсем; Я всегда пишу код, чтобы учиться! Итак, вот мои мысли ...

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

Чтобы попытаться держать себя на задании, вот мое понимание основных вопросов, заданных в ОП; Я буду держать на обочине как минимум, чтобы объяснить ....

Сначала быстрые ответы:

я был в подобной ситуации? Это было по крайней мере похоже; Я занимал руководящую должность, выполняя множество разнообразных проектов, которые, тем не менее, были связаны ... (CRM / Web / DB / Data Integration / и т. Д.)

как / почему я сделал переход к функционалу? » Я видел несколько примеров LINQ, и хотя я определенно мечтал о каком-то интегрированном, статически типизированном языке запросов [поскольку я в основном использовал статически типизированные языки (прежде всего C ++, а позже C #) )] на протяжении всей моей карьеры ... Но это была довольно быстрая обстановка, в которой я находился, и хотя мне часто удавалось увидеть, что происходит в прошлом, я никогда не задумывался об этом, поэтому я никогда не предвидел, что это мог / мог бы так же легко разрешить операции с Простыми Старыми Объектами (смеется!), когда я увидел это, я понял, что мне нужно это иметь ... так вот почему и началось то, как: я сосредоточился на том, чтобы научиться понимать LINQ ,

Четыре Мысли ... ошибаться, нет, это не так ... Мысли

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

Я был почти полностью основан на статически типизированных языках + метафоры и паттерны ООП + все, что я в итоге случайно обернул вокруг себя, решая мои настоящие проблемы за эти годы ... Суть в том, что если вы совсем такие, как я, Скорее всего, у вас много мозгов, посвященных вещам, которые не помогут вам с LINQ / FP.

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

И у ФП есть такие же сногсшибательные (для тех, кто не затрагивает парадигму) концепции и другие вещи, которые с ней связаны, и (хотя я считаю, что гибридизация множества методов идеальна для меня), я понимаю больше и с течением времени именно то, насколько ограниченным было мое мышление, прежде чем я приобрел реальные функциональные способности в своем наборе инструментов; В прошлом мне удалось воплотить в жизнь многие вещи, которые были немного более креативными, чем, возможно, большинство программистов ОО, но, поскольку я использую понятия о том, насколько медленным было мое мышление, было раньше ... Существуют целые классы проблем, которые можно решить. в нескольких строках, которые в C ++ / C # чертовски много искажали.

вдруг ты оказываешься ...

В "Слишком длинном" посте

Вы в лабиринте извилистых "не читал", все так.

Вы видите телеконференцию в ближайшем будущем, быстро приближается.
> немногословный
Ага. Конечно. Хорошо, мы скажем «краткий» режим «включен».

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

Вы видите телеконференцию в ближайшем будущем, быстро приближается. 
> эй, это за тобой крик?
Какая!? ГДЕ?! [убегает с криком]

> Извините, я не понял ЧТО ГДЕ, перефразировать?
[продолжал бежать и кричать, сарказм незаметно]

Итак ... Чему я должен научиться, дорогая PSE, дорогая PSE?

Я лично начал в C # с LINQ. Это позволило мне представить несколько концепций за раз, и, хотя я постоянно читал о FP и его концепциях, а также о LINQ и отношениях между ними, он дал мне путь вперед, продолжая при этом продуктивно работать. Я добавил несколько вещей одновременно, запросы данных быстро стали для меня полезным инструментом без необходимости понимать тонну.

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

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

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

И хотя я не придумал ничего крутого, о чем я мог бы рассказать, как самосознательную Программу Крабов, мне удалось довольно неплохо это сделать.

И ... чему я научусь, дорогая PSE, дорогая PSE, с чем?

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

Я уверен, что вы можете найти много вещей, которые вас интересуют, к которым относится FP; он предлагает все, от улучшений до ООП, которые помогают вам изложить вещи более лаконично, вплоть до превращения того, как вы думали об этом раньше, в форму, которую вы не узнаете и, скорее всего, даже не имели ментальной модели для выражения перед.

Но ... В моей модели дыра, дорогая PSE, дыра ...

И именно поэтому важно, что, особенно в начале, но на самом деле в течение всего времени обучения (и разве это не всегда так, когда вы чему-то учитесь?), Вы, по крайней мере, тратите немного времени между проблемами, чтобы прочитать что-то не связанное, но по-прежнему FP и время для чтения исходного кода, написанного экспертами, предпочтительно для решения тех же или похожих задач; а также их объяснения вещей ...

И все это время вам приходится напрягать свой мозг, чтобы понять все это, не с вашей старой точки зрения, а изнутри самой FP ... В какой-то момент для меня это щелкнуло, и ... вещь, которую я могу лучше всего связать с этим становится более или менее свободно владеющим голландским языком; в какой-то момент мне удалось достаточно погрузиться в образ мыслей (я сделал это с помощью погружения, что я и описал здесь; погружаясь в FP, а не пытаясь выучить это исключительно через "book larnin '" ...

И в конце концов я сделал; Мне удалось все усвоить и крутить свой мозг, пока я не начал высовывать FP / LINQ, даже не пытаясь перевести его обратно в ООП. (Да, я сделал это; мне нужно было что-то, чтобы повесить мою юбку. Шляпа. Что угодно.)

Последние мысли...

О-о, кажется, ты теряешь способность думать о своей умной подписи
заголовки разделов. Какой позор.

Телеконференция все еще быстро приближается. Это кажется намного большим теперь.
> Да, да, хорошо .. кратко и все. Я вижу, ты сумел потерять этого грёма.
 близкий вызов, это ... ну, да, я теряю ... О, НЕТ, ЭТО НАЗАД!
AAAAAAAHHHHHH !! [убегает с криком, еще раз]

Телеконференция все еще быстро приближается.
Это как-то напоминает сэра Ланжона Клизевиза.
Это почти на вас.
> Эй, поспеши обратно! У меня есть эксперимент с вами! (и по-та-то)

Вы можете найти много информации в Интернете о FP, естественно. Главное - понять основные понятия, а затем научиться их применять. Например, узнать об неизменности и почему это важно / полезно для FP. Я настоятельно рекомендую изучить небольшую теорию, чтобы согласиться со всем, например, как чистый FP может быть гораздо более поддающимся формальному доказательству. Это было движущей силой прародителя F #, ML. YMMV, конечно, вы можете быть кем-то скучающим до слез, и в этом случае, множество примеров, множество проб и ошибок, чтобы точно понять, почему используемые методы являются тем, чем они являются, помогут вам получить это «Ага!» момент лампочки.

Итак, я оставлю это сейчас. Надеюсь, это кому-то пригодится. Я хотел узнать немного больше о конкретных вещах, но сейчас у меня нет времени. Надеюсь, я скоро найду время, чтобы вернуться к нему, хотя для меня это будет долгая неделя, так что, вероятно, это будут как минимум выходные.

<3 «Представляем GRUEBOL, временный промежуток; до тех пор, пока не закончится SnozzML. Это должно быть скоро; в этот раз мне помог огромный комитет». - Грейс Хоппервит Яичная голова, Известные последние слова , XX97 GUE <3


что такое "дорогая ТА"?
комнат

был переполнен дорогой стек; должен соответствовать темпу песни 'A A Hole in the Bucket' xD
shelleybutterfly

когда он публикуется за пределами SO, это, кажется, затрудняет понимание ваших соображений - рассмотрите возможность редактирования, чтобы учесть это
gnat

Derp! да, действительно, сделали. tyvm. :)
shelleybutterfly

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