LINUX.ORG.RU
ФорумTalks

Это ваше фп

 , , ,


0

3

Удивительно положительное чувство овладевает человеком, когда он узнает что-то по настоящему новое.

Оно ещё более положительно когда человек не только узнаёт а ещё и осознаёт то, что узнал.

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

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

Но эрланг - это фантастика. Как можно писать на языке с только лишь константными переменными? А как же циклы? А ооп? Ну ооп ладно уж, ада вон тоже без ооп и ничего, хороший язык. Но некое чувство непонятности, как же на нём писать остаётся. Как же без переменных то? Рекурсия? А ну эта, которая стек в сях переполняет со временем? Знаем, знаем. Значит тоже фигня и ничего особенного? Ан нет!

Вот значит прочитал я про tail recursion optimisation и призадумался. Попробовал представить, как это на сях сделать, но остановился, и это хорошо.

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

Лямбды - так, слегка. Удобно, коротко, но не впечатляет.

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

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

И это епик вин, товарищи. Я определённо фанатею от этих штук, хотя и понимаю, что в ФП я в общем-то нуб.

Собственно вопрос такой: как после того, как твой мозг окончательно разломали продолжать писать на этом убогом с++? Как дальше жить и что дальше делать? Пытаться ли писать на с++ в ФП стиле? Но это же издевательство надо коллегами, никто из них же ничего не поймёт. А главное бонусов же за это реально не будет ни с т.з. производительности, ни с т.з. количества кода. Или я ошибаюсь? Может кто-то поделится историей успеха?

Спасибо.

Ходит байка, что когда автор эрланга начал читать книгу по плюсам, то где-то на 12 странице он швырнул её об стену и с тех пор не открывал.

flareguner ()

Может кто-то поделится историей успеха?

История такая. После Perl, JS, Erlang, Scheme мне дают написанный студентом проект на проприетарном MapBasic, и со словами «кто если не ты». Пришлось забыть про супер-силу, и писать как на old fortran (благо еще с физфаковских времен помню как это делается).

Но это же издевательство надо коллегами, никто из них же ничего не поймёт

А разве кодинг-стайл не декларируется? Вроде у вас, плюсовиков, должны быть туториалы «как правильно простреллить себе и коллегам ногу».

outtaspace ★★★ ()

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

PolarFox ★★★★★ ()

Указатели на указатели на указатели функций принимающих функции, принимающих функции, возвращающих функции....... OMFG!

varchar ()

Как можно писать на языке с только лишь константными переменными?

константными переменными

Мде.

Tail recursion с аккумуляторами разорвал мой мозг

Это многое объясняет.

как после того, как твой мозг окончательно разломали продолжать писать на этом убогом с++?

Сначала у тебя должна пройти эйфория.

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

Да смотрел уже. Но решил всё таки ерланг хорошо освоить сначала.

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

ну извини, я по профессии вообще не программист, так получилось.

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

Да у нас вообще бардак с этим делом. Кто как хочет так и делает. Лишь бы портабельно было.

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

ну извини

Да не за что. Просто фраза и нелепая, и заставляющая сомневаться в глубине понимания материала.

я по профессии вообще не программист

Судя по стене текста, по профессии ты как раз программист. По образованию - может, и нет.

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

Плюсую Erlang. Очень хорош для начала, и на практике пригодится.

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

я знал, что с меня будут ржать ))

Возможно кто-то, но не я.

varchar ()

Как можно писать на языке с только лишь константными переменными?

В функциональных языках не бывает „переменных“ в императивном понимании.

А как же циклы?

В функциональных языках не бывает циклов.

А ооп?

В функциональных языках не бывает „объектов“ в терминологии ООП.

Рекурсия?

А ещё свёртка и маппинг, например.

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

Теперь открой для себя continuation passing.

Как дальше жить и что дальше делать?

Очевидно, сухари сушить.

как после того, как твой мозг окончательно разломали продолжать писать на этом убогом с++?

Очевидно, как и раньше — садиться и писать.

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

Хм, ты меня заинтересовал этим эрлангом.

Dron ★★★★★ ()

Попробуй наформошлепить на эрланге пару десятков форм. Возможно все пройдет и тебя отпустит

goingUp ★★★★★ ()

Определись, будешь продолжать писать на С++? Если в рамках проекта, то думаю что да, пихать только что прочитанное с воспаленными мозгами в проект - вершина неадекватности. В С++ можно использовать элеметны ФП - лямбды, ФВП, иммутабельность (в рамках нормально). Главное чтобы код не становился грязнее, напиши посмотри и сам оцени

vertexua ★★★☆☆ ()

Но это же издевательство надо коллегами, никто из них же ничего не поймёт

Что ж вы так плохо думаете о коллегах? Вы же поняли, а они что тупее паровоза?

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

Это всего лишь ощущение.

после того, как твой мозг окончательно разломали продолжать писать на этом убогом с++?

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

no-such-file ★★★★★ ()

Даже если вы ненавидите ФП, писать на С++ не нужно. Есть куча куда более годных языков.

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

в некоторых учебниках видел, «это переменные, значения которых нельзя изменить. Их называют имена(names)». Просто, так человеку проще понять наверное, учебник был для студентов, узнавших только о С и С++.

zarkone ()

Читал я про лисп, читал. Не понял в чём фишка, забросил

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

Komintern ★★★★★ ()

Вам нужно ооп? Так в эрланге процессы и являются аналогами объектов. Только не плюсовых, а смолтоковых. А писать на эрланге надо, используя OTP.

OldManClone ★★ ()

Собственно вопрос такой: как после того, как твой мозг окончательно разломали продолжать писать на этом убогом с++?

чувак, не сочти за обиду — ты серьезно пишешь, или под веществами?

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

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

т.е. да, можно спорить «вот мне больше эстетически нравится цикл, а мне — хвостовая рекурсия», однако разница там обычно не существенна

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

з.ы. да, с++ жутко говоролив (хуже него только ява), но это не ставит вопроса «как жить дальше» — можно продолжать разговаривать идиомами

www_linux_org_ru ★★★★★ ()

Мои поздравления. Сам в универе делал студ проект, отправился делать гуй на Яве, мтивировав это тем, что OCaml является «объективным верблюдом». Когда разобрался --- пообешал себе больше никогда не писать на Яве. ;D

Писать на «убогом» С++ можно, так как С++ есть за что уважать (Qt, KDE, etc.). Ещё можно делать гуй на С++ библиотеках (ну или не совсем С++ --- QML), а содержательные вещи --- на функциональщине. Вот про Явы и До-диезы я бы такого не сказал...

Javascript'ы тоже можно выкинуть, а писать на классической функциональщине.

P.S. Если вам скажут что в ФП не бывает циклов, мутабельности, объектов --- не верьте.

Kakadu ()

Мне вот интересно, что ТС пишет, что любой яп его устраивает и можно обращать внимание на фичастость. Аналог grep ? Тогда зачем на erlang, сети может не быть ?

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

gh0stwizard ★★★★★ ()

полку фанатиков-теоретиков функциональщины прибыло

wota ★★ ()

Классический экстаз неофита.
Скукота.

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

Вывод: cектанты-кульхацкеры не нужны.

Неправильно. Вывод: по данным ресурса dice.com нужно 68 сектантов-кульхацкеров.

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

Ещё можно делать гуй на С++ библиотеках
Вот про Явы и До-диезы я бы такого не сказал...

.NOT вполне себе имеет качественный набор виджетов для оффтопика. ГУЙ для .NOT клепается в VS nfr почти как же хорошо, как в QtCreator

Там даже есть пародия на QML, WPF кажись.

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

Я с сервелат/WPF работал и мне оно не понравилось. Очень сложное. QML нравится гораздо больше.

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

Если вам скажут что в ФП не бывает циклов, мутабельности, объектов --- не верьте.

В ФП наверное таки нету. В языках, которые поддерживают ФП, часто есть

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

да, с++ жутко говоролив

Волшебная магия макросов или шаблонов! И даже обфускация не понадобится.

schizoid ★★★ ()

А как же циклы?

map, foldl, foldr, foreach, рекурсия. В фп с нормальным Tail-call optimization циклы вообще не нужны.

А ооп?

Хотелось бы, да.

Как же без переменных то?

В многопоточных ЯП, переменные — это синоним отсутствия нормальной многопоточности.

Лямбды - так, слегка. Удобно, коротко, но не впечатляет

В эрланге синтаксис лямбд не очень эффективен.

продолжать писать на этом убогом с++?

Многие фичи функциональных языков являются слишком высокоуровневыми для языков, компилируемых в машкод. haskell ghc — это скорее исключение из правил. Ну а в эрланге динамическая типизация со всеми вытекающими.

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

В функциональных языках не бывает циклов.

возьми да напиши свой

В функциональных языках не бывает „переменных“ в императивном понимании.

возьми да напиши свои

В функциональных языках не бывает „объектов“ в терминологии ООП.

возьми да напиши свои

stevejobs ★★★☆☆ ()

Собственно вопрос такой: как после того, как твой мозг окончательно разломали продолжать писать на этом убогом с++?

Использовать ФП для прототипирования. Я так делал с Хаскелем, вполне успешно. Хаскель ещё в дополнение даёт очень удобную дисциплину типов, так что становится совсем хорошо. Потом переписываешь на плюсах, или на чистом C, уже убедившись, что всё работает.

А главное бонусов же за это реально не будет ни с т.з. производительности, ни с т.з. количества кода.

Будут бонусы с точки зрения качества кода. А это зачастую приводит и к бонусам по количеству.

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

Попробуй наформошлепить на эрланге пару десятков форм.

Формошлёпить не пробовал, но, скажем, под веб писать, на Happstack-е — самое милое дело.

Miguel ★★★★★ ()
Ответ на: комментарий от no-such-file

из крестов вы можете сделать себе маленький эрланг

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

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

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

Хм, а что за случай? Так, для общего образования.

Miguel ★★★★★ ()

бонусы от ФП - хорошая читаемость кода, краткость кода, редкость ошибок, ну и скорость написания кода

а вот производительность самого кода - не бонус, на ней можно в том числе и проиграть

кресты и правда для ФП плоховато годятся, хотя нельзя сказать, что совсем не годятся

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

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

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

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

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

BattleCoder ★★★★★ ()

фп часо весьма-весьма хорошо для выражения алгоритма, но для его разработки - не очень: проще нафигачить работающих (императивный) говнокод «снизу вверх», поиграть с ним, оттестировать, а потом уже «написать красиво». Здорово, когда один язык позволяет *просто* сделать и то, и другое. Но таких языков практически нет.

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

вы путаете терминологию.

ФП и ИП - это подходы (императивный и функциональный). Большинство ЯП поддерживают оба подхода, некоторые может только один из них.

ООП-подход, как правило, ортогонален к ФП подходу и ему не мешает. Объекты, в том числе наследуемые/инкапсулируемые/полиморфные и т.п. вполне могут быть неизменяемыми - этого достаточно, чтобы программу называть ФП-чистой ;)

а вот языки - да. языки могут содержать циклы/объекты - или их может не быть.

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

не соглашусь... порой бывает проще, как вы выразились, «нафигачить» работающий функциональный код, и тестировать его, к слову, тоже проще.

а потом, если вдруг производительность или прожорливость не устроит - критичные места переписать в императивном стиле.

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

А на чем таком мейнстримном писать быстрый не-энтерпрайз? Удобнее же, чем Си, а скорость почти та же. Java? Scala (если это можно назвать мейнстримом)?

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