LINUX.ORG.RU
ФорумTalks

Это ваше фп

 , , ,


0

3

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

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

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

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

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

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

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

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

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

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

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

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

Спасибо.

Ответ на: комментарий от BattleCoder

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

функциональный код (декларация алгоритма) как раз-таки фигачится сверху-вниз (поидее), то есть когда мы формулируем *что* нам нужно, по ходу уточняя, здесь и композиция функций в префиксной нотации (все ml-подобные и lisp) - от общего к частному - и все эти ваши оговорки: where, if и прочие фазы луны.

и тестировать его, к слову, тоже проще.

Тестирование через отладочную печать (сайд-эффекты) - не уверен :)

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

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

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

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

... весьма хреново :) нормально (обычно) - только один из.

ООП-подход, как правило, ортогонален к ФП подходу и ему не мешает.

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

Объекты... вполне могут быть неизменяемыми

Не могут, либо это объекты (в терминологии ооп), либо неизменяемые структуры.

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

да ладно вам. далеко не всегда от общего к частному.

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

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

... весьма хреново :) нормально (обычно) - только один из.

Чем плохи императивные возможности в scala, например? и чем плохи функциональные возможности в python?

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

Чем плохи императивные возможности в scala, например?

Да в ней и с функциональными хреновенько.

и чем плохи функциональные возможности в python?

Нет tco (фатально), убогие лямбды (гвоздь в крышку гроба).

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

да ладно вам. далеко не всегда от общего к частному.

Что значит «далеко не всегда»? Так выглядит код во всех функциональных языках, что я видел (хаскель, ocaml, ml, clean, scheme, racket...) и в лиспе из-за префиксной нотации - то же самое: вначале находится самая общая, самая последняя, ф-ция применяемая к неизвестно чему (узнаем в конце выражения).

очень много задач можно разбить на части...

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

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

Это все понятно, поддерживаемый императивный код пишется точно таким же образом.

alienclaster ★★★
()

Историй успеха нет, так как в мире аж 1.5 вакансий на места хацкелистов и прочих фп. Люди не умеют думать, а на фп надо. Кода будет меньше, да, зато просиженных в пустую часов - больше.

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

Претензия к отсуствию TCO смешна. Его и в Scala нет, но к за это ней вроде претензий не прдъявляют (или ты предъявляешь?).

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

Историй успеха нет, так как в мире аж 1.5 вакансий на места хацкелистов и прочих фп

erlang стал такой халявной попсой (норм платят, учится за 3 недели), что даже стыдно упоминать.

Люди не умеют думать, а на фп надо.

Императивно думать куда сложнее - просто большинство уже привыкло именно так.

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

Претензия к отсуствию TCO смешна.

Ну давай без этой вот херни, да? Какое может быть фп без нормальной рекурсии?

Его и в Scala нет, но к за это ней вроде претензий не прдъявляют (или ты предъявляешь?).

А кто к ней может предъявить претензии, жабщики вчера на нее слезшие? :) Да ты че, они в восторге, как с тяжелых металлов на героин.

alienclaster ★★★
()

И, кстати, раз уж рекурсия мозг взрывает, советую prolog (логическое программирование) покурить. Эйфория от фп уйдет, придет непонимание вообще ничего и ты вернешься в лоно святой, като.. на плюсы. А лучше яву юзай вместо плюсов.

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

норм платят, учится за 3 недели

а в это вообще не верю, хоть эрланга и не знаю

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

И, кстати, раз уж рекурсия мозг взрывает, советую prolog (логическое программирование) покурить

И что там курить?

Эйфория от фп уйдет, придет непонимание вообще ничего

В прологе понимать нечего, совсем.

ты вернешься в лоно святой, като.. на плюсы. А лучше яву юзай вместо плюсов.

На каком первом языке учился программировать?

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

Какое может быть фп без нормальной рекурсии?

А с каких пор использование хвостовой рекурсии стало обязательным для ФП?

И просто для протокола: TCO и хвостовая рекурсия (оптимизация хвостовой рекурсии) - не одно и то же.

А кто к ней может предъявить претензии, жабщики вчера на нее слезшие? :)

Я так понимаю, к Scala претензий нет. Вот и к Python предъявляй вменяемые претензии.

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

А с каких пор использование хвостовой рекурсии стало обязательным для ФП?

Шутишь, всегда так было. SICP тебе за пруф.

TCO и хвостовая рекурсия (оптимизация хвостовой рекурсии) - не одно и то же.

Да я знаю, сказать-то что хотел?

Я так понимаю, к Scala претензий нет.

Нет в scala оптимизации хвостовой рекурсии - других претензий нет.

Вот и к Python предъявляй вменяемые претензии.

В нем ее тоже нет - «вменяемая претензия».

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

На каком первом языке учился программировать?

Я учился на си, но это суть.

И что там курить?
В прологе понимать нечего, совсем.

В самом прологе может и нечего, а в логическом п. в принципе очень много чего надо и курить и понимать. На прологе нельзя писать некрасиво, а можно только полностью осилив парадигму.

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

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

Никакого такого отдельного «логического программирования» нет - есть набор логик, пролог, например,- это реализация логики предикатов.

На прологе нельзя писать некрасиво

Можно

а можно только полностью осилив парадигму.

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

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

А с каких пор использование хвостовой рекурсии стало обязательным для ФП?

Шутишь, всегда так было. SICP тебе за пруф.

Ах ты господи. Вопросов больше нет.

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

Тоа!! Эрланг, каким бы он нибыл - не пхп.

Понял что такое функциональное программирование без побочных эффектов + 2 недели на чтение книги армстронга + 1 неделя почитать офдоки = осилил erlang.

Пхп вот я, например, не осилил :) В свое время от вебни открестился именно из-за этого языка :)

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

Ах ты господи. Вопросов больше нет.

Решил сегодня напиться-накуриться после долгого перерыва? Ничего, я не сержусь.

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

Решил сегодня напиться-накуриться

Нет ты. SICP у тебя уже определение ФП, ахренеть вообще.

Когда отпустит, прочитай и запомни:

«In computer science, functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data».

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

Никакого такого отдельного «логического программирования» нет

Советую глянуть в книгу «The art of prolog».

Вообще, все вменяемые учебники сначала рассказывают о том самом «логическом программировании», которого нет.

А потом уже идут в имплементации, такие как пролог.

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

«In computer science, functional programming is a programming paradigm that treats computation as the evaluation of mathematical functions and avoids state and mutable data».

Ой, только не надо строить тут из себя занудного имбецила, твое определение фп - не канонично.

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

Оно общепринято.

Заборы общепринято представляют сущность на них изображенную, да. А твое определение - узко и в то же время излишне абстрактно, размыто.

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

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

Оно не мое и не абстрактное - с его помощью Питону предъявляются важные и вменяемые претензии по поддержке ФП.

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

Оно не мое и не абстрактное - с его помощью Питону предъявляются важные и вменяемые претензии по поддержке ФП.

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

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

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

Не соглашусь. Вы, как и ТС тоже считаете, что все вокруг тупые и не поймут ФП на крестах?

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

ну-ка расскажи

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

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

Вы, как и ТС тоже считаете, что все вокруг тупые и не поймут ФП на крестах?

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

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

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

а отсутствие ТСО - это фейл, хоть и не фатально. неужели так сложно это реализовать на уровне интерпретатора? %) сто лет назад же сделали ещё в схеме. а питон, к слову, от схемы кое-что заимствовал

BattleCoder ★★★★★
()

А от задачи идти не пробовал? Ты ж не станешь делать табуретку бензопилой или валить дуб лобзиком.

Ну вот, допустим, у меня есть некий продукт в перманентной beta-версии. Писаться он начал уже давно, на pure-Сях, в то время, когда в голове была некая Идея. Аморфная концепция. И всё. Ни знаний, ничего.
Спустя время я познал базы данных. То есть, я знал, что есть такое в природе, но никогда до этого их не программировал и не админил.
Поделка сначала была адаптирована к самописному подобию БД (которая, кстати сказать, отпочковалась в отдельный продукт; в её основе тоже своя Идея).
А уже сейчас я вплотную столкнулся с необходимостью вкуривания ООП. После мук выбора инструмента остановился на джаве. Тяжеловато идёт, скажу честно. Давит предыдущий опыт и непрофильное образование.
И сейчас, если удачно сложится, продукт будет абсолютно другой, гораздо мощнее по возможностям.

И, кстати, на изменения меня натолкнули именно Толксы ЛОРа.

Deleted
()
Последнее исправление: rht (всего исправлений: 1)
Ответ на: комментарий от no-such-file

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

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

Формошлёпить на эрланге не стоит. И вообще, написание гуя на ФЯ - задача нетривиальная в понимании.

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

В «чистых» функциональных не бывает. Можно сделать, но зачем?

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

я знаю. но обычно это проще объяснить как «неизменяемая переменная».

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

а теперь по русски и кратко - как ты value-binding будешь объяснять человеку знакомому только с императивными языками. Кратко и по русски.

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

как ты value-binding будешь объяснять человеку знакомому только с императивными языками

А теперь по-русски и кратко - причем здесь это?

Кратко и по русски.

«Переменных нет. Есть только именованные значения, которые нельзя изменить.»

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

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

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

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

А теперь по-русски и кратко - причем здесь это?

Потому что сначала человек изучает какой-нибудь бейсик или джаву и только потом доходит до чистых ЯФП.

«Переменных нет. Есть только именованные значения, которые нельзя изменить.»

Ок. Теперь я знаю как это сказать нормально.

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

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

Да блин. ТС пришел на ЛОР и, значит, имеет право использовать и английский язык, и термины, непонятные изучающим бейсик.

Теперь я знаю как это сказать нормально.

Если ты собираешься использовать эту фразу в объяснениях, неплохо бы добавить что-нибудь вроде «В зависимости от контекста исполнения, к одним и те же имена могут быть привязаны к разным значениям» (это о рекурсии, в том числе хвостовой).

Но нормальный учебник, конечно, лучше.

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