LINUX.ORG.RU
ФорумTalks

Изучение функционального программирования делает ваш код лучше


1

3

Или нет? У меня есть сомнения, так как во всех коллективах принято писать код согласно определенным конвенциям. Человек, который хочет применить ФП в обычных проектах на примитивных императивных языках без особых средств ФП скорее всего имеет в распоряжении

  • Рекурсия (если есть надежда на хвостовую)
  • Выполнение операций на основе предикатов или трансформирущих объектов.
  • Принятие решений на основе конфигурирующих данных. Как бы точнее выразиться? Например построение небольшого интерпретатора, из нескольких команд.
  • Иммутабельность чем больше тем лучше
  • Попытка работать с объектами как с функциями (частичное применение, или создание предикатов как в п. 2)
  • Еще что-то забыл, дополняйте

Но в большинстве коллективов (С, С++, Java) эти приемы будут восприняты как странные, и более того вообще быдлокодом. И на этом языке он и есть быдлокодом в некоторой мере. Тоесть концепции нормальные, но в соединение со средствами которые делают их простыми и краткими. А на вышеперечисленых ЯП лишь гора if-ов и 100500 объектов с нетривиальным состоянием - конвенция.

Вывод: изучение ФП - расширение кругозора, открытие для себя основаных на ФП инструментов. Не повод его пихать везде или гнуть в эту сторону палку в императивном коде как делают некоторые упоротые.

Ваше мнение?

★★★★★

Последнее исправление: vertexua (всего исправлений: 1)

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

vertexua ★★★★★
() автор топика
Последнее исправление: vertexua (всего исправлений: 1)

Ссылайся на Александреску всё-время. Его почти все знают и пусть он писал не об этом, его всё-равно почти никто не читал.

Tark ★★
()

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

Да. Есть другие парадигмы и от задачи зависит какую использоваться удобнее. Другое дело, что фанатиков в этом не убедить :)

Kadi
()

Не повод его пихать везде

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

ugoday ★★★★★
()

Ваше мнение?

Серебряной пули нет.

Relan ★★★★★
()

Иммутабельность, по-моему, представляет ценность не в плане следования заповедям ФП, а в плане облегчения распараллеливания. Но ясно одно: подобно тому, как не сто́́ит мешать пиво с водкой, так и не сто́́ит мешать вместе разные подходы к написанию программ: был один бармен-неудачник, который влил в Си объекты, и получился C++ — напиток, которым отравилось огромное количество народу. А не так давно ещё один шутник смешал Яву и протухший экстракт ФП, и получился тошнотворный коктейль по имени Scala. Лучше бы сидел себе, да по вечерам иногда принимал Haskell без закуски, ибо почти все мировые эксперты признали, что в малых дозах он полезен в отличие от того же Lisp'а.

CARS ★★★★
()
Ответ на: комментарий от CARS

подобно тому, как не сто́́ит мешать пиво с водкой, так и не сто́́ит мешать вместе разные подходы к написанию программ

Глубина мысли просто потрясает.

tailgunner ★★★★★
()

Ну, отдельные вещи, по-типу монад и чистых функций, итераторы, могут быть полезны даже в Си

XVilka ★★★★★
()
Ответ на: комментарий от Tark

Ссылайся на Александреску всё-время. Его почти все знают и пусть он писал не об этом, его всё-равно почти никто не читал.

Потрясающий совет, обязательно попробую. Ещё, наверное, Спольски подойдёт.

i-rinat ★★★★★
()

Замечал за собой активное использование рекурсии с эмуляцией списков в проекте на C#.

encyrtid ★★★★★
()

Изучение функционального программирования делает ваш код лучше

Изучение программирования делает ваш код лучше, ага.

geekless ★★
()
Ответ на: комментарий от vertexua

В языке без pattern matching пользоваться этим не так просто. Кроме того, списки иммутабельны, а IEnumerable - нет.

encyrtid ★★★★★
()
Ответ на: комментарий от Tark

Ссылайся на Александреску всё-время. Его почти все знают и пусть он писал не об этом, его всё-равно почти никто не читал.

В квотезы.

geekless ★★
()
Ответ на: комментарий от ugoday

С каких пор итераторы стали ФП?
Наводящий вопрос: mapcar, reduce и remove-if это фп или не фп?

for (auto i = begin(x); i != end(x);)
  if (pred(*i))
    i = x.erase(i);
  else
    ++i;

Это ФП или нет?

Begemoth ★★★★★
()
Последнее исправление: Begemoth (всего исправлений: 1)
Ответ на: комментарий от Begemoth

Это почти ФП. Если добавить чистоты, то это будет классический случай ФП, пусть и записанный довольно странным образом.

ugoday ★★★★★
()
Ответ на: комментарий от XVilka

Итераторы не совсем ФП, но часто встречаются в ФП языках, потому и упомянул.

Итераторы, ЕМНИП, были изобретены в трижды насквозь императивном CLU, а к ФП они ортогональны.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Я и не говорю, где они были изобретены, и т.п.

XVilka ★★★★★
()
Ответ на: комментарий от tailgunner

ФВП - это не итераторы.

Да, ФВП это гораздо больше. А вот list comprehension --- это уже нечто, весьма близкое к итератором. А если list comprehension не ФП, то я того даже не знаю что вообще можно назвать ФП.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

Это почти ФП.

С чего бы? Самая что ни на есть императивная императивщина.

Если добавить чистоты

Совсем чуть-чуть :-)

Begemoth ★★★★★
()

Думаю что изучение ФП просветляет. Но это не значит что надо будет везде ляпать паттерны из ФП на не-ФП ЯП. А так такие знания лишними не бывают.

true_admin ★★★★★
()
Ответ на: комментарий от ugoday

list comprehension --- это уже нечто, весьма близкое к итератором

синтаксический сахар над map и filter это нечто близкое к абстрактной последовательности?

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

С чего бы?

Ты написал деструктивный remove-if. Добавить одно копирование, чтобы оно не портило исходный список и в любом лиспе-хаскеле этот код будет смотреться как родной.

ugoday ★★★★★
()
Ответ на: комментарий от ugoday

ФВП - это не итераторы.

Да, ФВП это гораздо больше.

Зависит от точки зрения.

А вот list comprehension

...тоже не итераторы.

А если list comprehension не ФП

А если они ФП, то твое понимание ФП отличается узостью.

tailgunner ★★★★★
()

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

А в ряде случаев применение элементов ФП позволяет значительно упростить код, пусть и ценой производительности. Инструменты для этого кое-какие есть: first class functions реализуются в c++ через функторы, в частности - boost::bind и boost::function; есть boost::lambda и c++11 anonymous functions...

Manhunt ★★★★★
()
Ответ на: комментарий от ugoday

А если они ФП, то твое понимание ФП отличается узостью.

Что ты имеешь ввиду?

Что ФП - это нечто большее, чем list comprehensions (и ФВП).

tailgunner ★★★★★
()
Ответ на: комментарий от Begemoth

Ну и на крестах можно писать аналогично (пусть и с более костыльным синтаксисом), если не задаваться вопросом про особенности реализации split, filter и sort.

geekless ★★
()
Ответ на: комментарий от ugoday

Добавить одно копирование

Я неясно выразился: замена деструктивного удаления на копируещее приведёт к необходимости правки всех мест использования функции, то что я привел вполне естественный кусок императивного кода, о ФП я бы говорил, если бы оформил это функцией и о коде, который эту функции использовал бы. А иначе можно придти к тому, что идиоматический С - это почти ФП.

Begemoth ★★★★★
()
Ответ на: комментарий от ugoday

ФП - это нечто большее, чем list comprehensions

Я где-то утверждал обратное? Ссылку в студию.

Утипути. Да, ты утверждал:

ugoday> если list comprehension не ФП, то я того даже не знаю что вообще можно назвать ФП.

Ах да, ссылка: Изучение функционального программирования делает ваш код лучше (комментарий)

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Похоже питон окончательно съел твой мозг. Печалька. Помедетируй на досуге над фразой:

если селёдка это не рыба, то я даже не знаю что назвать рыбой.

P.S. Надеюсь ты просто пьян с утра по поводу пятницы.

ugoday ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.