LINUX.ORG.RU

Нужно ли ФП обычным смертным программистам?

 , ,


1

2

Я c++ джуниор, работаю в интересной компании. Я хочу развиваться как программист.

Что делать с ООП понятно: книжки по паттернам и наизусть свежие стандарты. Но что делать с ФП? Есть ряд вопросов.

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

Перемещено mono из talks


Я не осилил монады. Т.е., я примерно понимаю, к чему они. Мне казалось, что основная идея ФП - это «чистое» вычисление, в котором всё состояние лежит на стеке и нигде больше. Из этого многое следует. В т.ч., необходимо как-то примирить этот идеал с суровой реальностью, где так не бывает почти никогда.

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

В целом, ФП нужно в базах данных. В Oracle каким-то образом смотрится (или можно задекларировать), что хранимая процедура или функция является чистой. В этом случае, возвращаемое значение зависит только от аргументов. Что позволяет определённые оптимизации запросов.

Ещё - бывают stateless программы в вебе. Когда на сервере не хранится никаких данных, связанных с состоянием клиента. Всё надо передавать заново при каждом обращении. Но с этим я на практике не сталкивался, т.к. вебом не занимался.

Таково применение ФП в бизнесе.

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

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

Также я считаю, что нет смысла в «вообще чистом» ФП, нужно рассматривать разные случаи «относительно чистого ФП». Например: «эта функция не пишет в базу данных», «Эта функция не пишет в потоки», «эта функция не выделяет памяти» и т.п. Тот же самый const в С++ задаёт некое условие чистоты: «эта функция не меняет свой аргумент».

Насколько я хорош и нужен, судить не мне, но на жизнь пока что хватает.

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

Бабка надвое сказала же. Курица и яйтсо, известная философская проблема.

man «Краткий очерк истории математики» Стройка - идея о том что математика являлась отражением философских взглядов всех великих математиков красной нитью проходит через всю книгу. Сейчас же философия стала в глазах ученых чем-то второсортным, поэтому, видимо, второго Декарта, Лейбница, Ферма мы так и не дождемся.

NegatiV
()
Ответ на: комментарий от anonymous

Средняя зарплата по перечисленным специальностям - $40к в год. Средняя зарплата C++ или Java кодера в HFT - $250к в год.

anonymous
()
Ответ на: комментарий от slackwarrior

А ты то сам зачем учился в заборопокрасочном гадюшнике?

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

То есть просто фигачить алгоритмы, чтобы вручную балансировать деревья? Неужели это путь к Успеху? Мне кажется, что как раз, в современном программировании, самому писать свой быстрый map<T> или quenue<T> давно не нужно.

p.s. Вирта читал, Седжвика пролистал и понял что для моих задач это не нужно. Кнута читал - долго и упорно читал и даже закончил первую книгу.

JANB
() автор топика
Ответ на: комментарий от anonymous

Ага:-) У меня одноккрсник, философ по жизни... и попал он к Желнову на вступиетльных в аспирантуру что ли. Точнее Желнов попал... и после получасовйой беседы (точнее монолога - а Желнов слушал) ушел просветленным:-)

AIv ★★★★★
()

1. Нужно ли обычному программисту (не теоретику, а человеку для которого программирование - работа) понимать Функциональщину чтобы профессионально развиваться?

В какой то мере нужно. Монады и лямбда-исчисление, думаю, не обязательно. А уметь передавать функцию в качестве параметра или писать обработку рекурсивных структур данных бывает полезно.

3. Полезно ли вообще программисту читать книжки вроде SICP? (у которого нет главной жизненной цели - блистать умом на лоре).

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

Legioner ★★★★★
()

Попробуй писать на иммутабельном язычке в привычном императивном стиле. Не грузи народ тупняком.

Хакер? Хе-хе...

Лучше бы спросил как ООП реализовать в ФП-стиле. А то утомляет отсутствие прототипов, виртуальных методов, наследования, интерфейсоФ.

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

Попробуй писать на иммутабельном язычке в привычном императивном стиле.

Ты не поверишь!!! (см. монаду ST). Кроме того, сишная куча — лучший друг хаскелиста, а IO существует только в compile-time.

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

Причем GHC позволяет в compile-time собирать с помощью хаскеля код на хаскеле, строящий дерево вызовов. Т.е. реально запилить сбоственный язычок который с одной стороны будет компилироваться в более-менее эффективный ассемблер (хотя и уступая C++), а с другой стороны сможет использовать весьма и весьма разлапистые сервисы GHC и сторонних библиотек.

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

Первое - немного не то что ты описал, вторые два посмотрю, спасибо.

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

Года два назад я пытался запилить нечто подобное. Тогда у меня была задача с «комбинаторным взрывом» количества кода (т.е., грубо говоря, есть n функций и m алгоритмов над ними, крестовый полиморфизм использовать нельзя, ибо железка его не умеет).

Я делал именно так, как ты описал: с TH и language-c-quote. Ковырялся ещё в accelerate (не знаю как сейчас, но тогда внутри там творились ад и содомия, проще было выкинуть и переписать).

Пришёл к выводу, что эффективность и удобство подобного кодогенератора сомнительны. Чем на меньшие части ты разбиваешь сишный код, тем больше "бюрократии" приходится на каждый шаблон с хаскельной стороны. А использовать крупные части смысла не имеет: проще дёрнуть BLAS. Впрочем, я далеко не гений проектирования, возможно, более умный человек обошёл бы эту проблему.

fmdw
()
Ответ на: комментарий от NegatiV

У шефа один из аспирантов чуть было не ушел на философский факультет в аспирантуру (парень очень сильный). Так что нет, у некоторых физиков есть склонность к филослфии...

ИМНО философия это болезнь. Курс истории философии это как прививка:-)

AIv ★★★★★
()

А что такое «обычный программист»?

Если я подхожу под это определение, то да, нужно, ибо на работе на кложуре пишу.

Debasher ★★★★★
()

Если джуниор, то я бы так не спешил. Всему свое время. А польза есть, как от молотка. Им можно гвоздь забить, а можно и палец травмировать. Так и с ФП. Впрочем, с ООП, структурным программированием и т.п. тоже самое.

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

Пришёл к выводу, что эффективность и удобство подобного кодогенератора сомнительны.

Да. Может быть. Что-то типа подобного случалось и у меня. Но и я тоже совсем не гений. Да и задачи по выжиманию максимума производительности у меня никогда не стояло.

И TH — лютая помойка... И rewriting rules — тоже.

Но дело не в этом. Главное — можно. И, в принципе, вполне реально с практической точки зрения. Тем более, если рассматривать уровень C++.

Другое дело, что IO в рантайме не существует. Понятно что не все так просто, но компилятору хватает ума с виду неуклюжий код (тот же FFI) превратить в более-менее эффективный ассемблер.

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

Это от иноплонетян?

Дебил. С лямбда-исчислением и редукцией лямбда-термов ты познакомился в классе 3-м. Может раньше. С понятием свободной и связанной переменной — в пятом классе на уроках физики. Примерно тогда же, и примерно там же — с понятием простого типа.

С первой системой переписывания термов — в 7-м классе. Просто тогда эту хрень так не называли. Извини.

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

FFI оптимизация делается ровно никак и все что ты можешь сказать safe или unsafe call, а так же уменьшать время на маршалинг подбирая тип параметров.

А вот rewriting rules это основной инструмент дающий максимальный бонус при создании эффективных программ.

Впрочем говорить что ST (IO это враппер над ST) в рантайме будет не совсем корректно, см. последние посты well typed для описания модели вычисления, ещё можно сноймановые посты про unsafeInlineIO, он там популярно рассказал.

qnikst ★★★★★
()

1. Нужно ли обычному программисту (не теоретику, а человеку для которого программирование - работа) понимать Функциональщину чтобы профессионально развиваться?

Обычному — нет.

Хорошему нужно трогать все новое вне зависимости от отношения общества к этому.

Deleted
()
Ответ на: комментарий от hbars

А насчет что в школе - это конечно ты загнул.

Даже в мыслях не было. Я абсолютно *серьезно*.

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

а так же уменьшать время на маршалинг подбирая тип параметров.

Чем больше изучаешь, тем больше сюрпизов. Лично я раньше считал, что GHC принципиально не позволяет получать эффективный ассемблер, тем более управлять процессом его генерации.

Теперь же, дело оборачивается намного более жуткой стороной: всё намного эпичнее.

Но, факто остается фактом. Можно всё.

Думаю, все дело в том что а) передо мной никогда не стояло задачи по выжиманию максимальной производительности из GHC; б) слишком мало читал Core и C--.

А ведь еще есть громадная область в виде создания своих плагинов...

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

ну смотри FFI для ghc это черный ящик, тупо вызов вненей сишной функции, при этом при вызове вопрос что делать с рантаймом: или тупо останавливаем capability (unsafe ccall), это для очень коротких вызовов (порядка 10ns), но тогда вызов не может возвращаться runtime haskell, или сохранять стейт (safe ccall) тут есть оверхед на сохранение. Лучшее, что ghc может сделать это умудриться объединить несколько вызовов в один блок.

А вот остальные оптимизации, типа того, что в vector тут уже можно сделать много чего и асм действительно получается хорошим, а rewriting rules играют важную роль.

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

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

В Oracle каким-то образом смотрится (или можно задекларировать), что хранимая процедура или функция является чистой. В этом случае, возвращаемое значение зависит только от аргументов. Что позволяет определённые оптимизации запросов.

Кстати да - интересный момент. ФП дает шанс на дополнительную оптимизацию, например можно отложить вычисление, портировать, выполнить ассинхронно/параллельно (собственно ФП, дает такой шанс как быть безопасной сущностью)

Зачетно.

но все меняется когда приходят они, состояния...

anonymous
()
Ответ на: комментарий от slackwarrior

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

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

конечно филолога(т.е спеца по греко-лат.трудам до великого переселения ) от математика отличали но более подробного не было нужды.

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

у жрецов всегда достаток выше чем у крестьянина

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

как ни странно, но это(ознакомлении в школе) так.

подобно мещанину во дворянстве который узнал, что изъясняется прозой.

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

ну смотри FFI для ghc это черный ящик, тупо вызов вненей сишной функции

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

В ghc-prim вообще есть SIMD операции и префетчинг, правда я их применения в глаза не видел...

И специально для любителей мутабельности:

GHC позволяет генерить эффективный (с любой точки зрения) машинный код. Но, в отличие от остальных языков позволяет локализовать его в одном месте и спрятать за красивыми монадическими и/или полиморфными n-ного порядка интерфейсами.

Т.е. милости просим. По внутренностям GHC есть хорошая начальная документация. Лично вы (вплоть до особого распоряжения) можете считать монады интерпретаторами императивного языка, генерящими байт-код, который исполняется рантаймом GHC... И всё сразу встанет на свои места...

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

Я уж молчу про такие ужасы как Go, Rust, Ceylon и 6-ю версию JS.

Гм, а можно поинтересоваться, почему ты Rust в один список с JS занес и обозвал «ужасом»? Дело в банальной неприязни к синтаксису областей видимости и правилу расстановки ";" и т.п. или в чем-то более интересном? :)

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

Дело в банальной неприязни к синтаксису

Так точно. Привязывают к синтаксическим конструкциям языка то что привязывать не требуется, а потом рассуждают о «семантике».

Когда вместо того чтобы просто взять SML, и несколькими фрикциями напильника спилить с него налет академичности (см. напр. Mythril если еще не сдох) начинают выдумывать хтоническую химеру в которой ad-hoc стоит на ad-hoc'е и ad-hoc'ом погоняет.

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

Привязывают к синтаксическим конструкциям языка то что привязывать не требуется, а потом рассуждают о «семантике».
...начинают выдумывать хтоническую химеру в которой ad-hoc стоит на ad-hoc'е и ad-hoc'ом погоняет.

А можно более развернуто, а то я так и не понял, что не так с синтаксисом и про какие именно ad-hoc`и ты говоришь.

Когда вместо того чтобы просто взять SML, и несколькими фрикциями напильника спилить с него налет академичности (см. напр. Mythril если еще не сдох) ...

Ммм, вроде ж языки довольно сильно отличаются. Хотя я с ML семейством не слишком знаком. Разве что с хаскелем, да и на нем и пары тысяч строк не написал.

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

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

о, очень люблю эти вопросы. зачем человеку развиваться? полезно ли читать книжки?

если они у человека возникают, значит у него (вероятно) очень богатый внутренний мир. очень

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

Развиваться человеку нужно. Но, я как раз и не знаю, нужно ли для моего «развития» ФП? А изучать вообще всё - не вариант. А то, вообще можно начать учить ActiveX.

Так я и спрашиваю - чтобы «развиться» в хорошего программиста, нужно ли изучать ФП? Вдруг это такое же ненужно как и ActiveX?

JANB
() автор топика
Ответ на: комментарий от JANB

Но, я как раз и не знаю, нужно ли для моего «развития» ФП?

Не нужно. Совершенно не обязательно деградировать в борщехлеба.

anonymous
()
Ответ на: комментарий от ozkriff

я языки в разрезе разработки игр рассматриваю обычно.

Фу-фу-фу! Какая гадость!

anonymous
()
Ответ на: комментарий от qnikst

Ни что не залог успеха в IT, если не дано* - ФП** не поможет, если дано, к успеху и без ФП** прийти можно.

успех в IT - держаться подальше от IT (c) Ганди

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

Монады — фича не конкретно ФП, это фича полиморфизма высших порядков. И этим полиморфизмом можно много крутых вещей делать, не только играться со списками и IO.

quantum-troll ★★★★★
()
Ответ на: комментарий от JANB

Тогда реквестирую литературу, которую нужно прочитать, чтобы стать _не_дебилом_.

кастанеду почитай, станешь точно недебилом

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

Когда вместо того чтобы просто взять SML, и несколькими фрикциями напильника спилить с него налет академичности (см. напр. Mythril если еще не сдох) начинают выдумывать хтоническую химеру в которой ad-hoc стоит на ad-hoc'е и ad-hoc'ом погоняет.

О вау... сразу видно специалиста. А вот что имеет сказать некий Роберт Харпер:

«Two examples have arisen just this summer, Rust (from Mozila) and Swift (from Apple) [...] it is evident from even a brief review of their web sites that these are serious languages that take account of the academic developments of the last couple of decades in formulating new language designs to address new classes of problems that have arisen in programming practice»

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

и почему бы не разобраться с тем и с другим, и уже по собственному впечатлению решить, насколько одно и другое - ненужно? чего вы боитесь - потратить своё безмерно ценное время? перенапрячь свой безмерно слабый мозг? чего?

заинтересовала тема - взял да почитал. что-то непонятно - задал конкретный вопрос. понял, что не идёт - бросил. но спрашивать заранее «а стоит ли браться?» это какая-то превосходная степень глупости

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

тане, достаточно собрать, высушить и пожевать :)

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

чего вы боитесь - потратить своё безмерно ценное время? перенапрячь свой безмерно слабый мозг? чего?

Почему вы не хотите попробовать говно на вкус? Чего вы боитесь - потратить свое безмерно ценное время? Съесть лишние калории?

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