Главная Настройка Mobile Контакты NSFW Каталог Пожертвования Купить пасскод Pics Adult Pics API Архив Реквест доски Каталог стикеров Реклама
Доски


[Ответить в тред] Ответить в тред

Check this out!


[Назад][Обновить тред][Вниз][Каталог] [ Автообновление ] 62 | 3 | 24
Назад Вниз Каталог Обновить

ПФП-тред Аноним 28/11/17 Втр 01:01:47  1099260  
erlang-face.png (407Кб, 959x636)
Паттерны функционального программирования обсуждать тут, а то хуль разбрелись все по сотне своих полудохлых тредов.

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

Ну так вот, епта, я сейчас думаю о том, чтобы в этот контекст заебенить замыкания с теми нужными модулями. Но хуй знает, это хак или нет? По идее контекст этот предназначен для хранения данных. Ебашить туда замыкания - это вообще законно?
Аноним 28/11/17 Втр 06:10:03  1099336
У тебя в слове ПхП опечатка.
Аноним 28/11/17 Втр 06:14:38  1099337
А в чем вообще главная идея функционального программирования?
В том что вместо циклов используется рекурсия? Во всех функциональных языках ведь тоже самое как и в не функциональных: только синтаксис немного отличается.
Аноним 28/11/17 Втр 08:20:38  1099357
>>1099260 (OP)
>Но хуй знает, это хак или нет?

Использовать замыкания для решения архитектурных проблем - признак хренового ООП.

Использовать их или нет? Смотри на легаси которое придется переписывать.

> Вот есть у меня система, все зависимости древовидные, везде все явно передается, все красиво-православно. И есть дсл поверх этой системы, и внутри этого дсл мне надо иметь доступ к нескольким функциям

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

yoba модуль нейм
Было:
> call(1,2,3,4,5)

Стало:
> func = config["func"] || DefaultFunc
> func.new(self).call(1,2,3,4,5)
Аноним 28/11/17 Втр 09:21:10  1099367
>>1099260 (OP)
>Паттерны функционального программирования
Их не существует. Кроме того, любой разговор о каких-то там 'паттернах' в программировании - полная лажа.
Аноним 28/11/17 Втр 09:26:48  1099371
>>1099337
>А в чем вообще главная идея функционального программирования?
http://fprog.ru/2009/issue1/eugene-kirpichov-fighting-mutable-state/
Аноним 28/11/17 Втр 10:26:59  1099398
>>1099357

Бтв, утром продолбился в глаза про пфп (были же хаскель/эликсир etc треды). Ну тогда наверное да, замыкания.
Аноним 28/11/17 Втр 15:25:05  1099543
>>1099367
Типичный случай парадокса Блаба. Знаешь, книги тоже пишут словами, однако же всякие завязки и кульминации там используются.
Аноним 28/11/17 Втр 16:01:02  1099557
>>1099543

Паттерны в ооп параше, монады - в фукциональной.
Аноним 28/11/17 Втр 22:18:35  1099769
>>1099337
Пошел нахуй.

>>1099357
>Использовать замыкания для решения архитектурных проблем - признак хренового ООП.
Люто двачую, потому и спрашиваю.

>>1099398
Бля, но ты в том посте про что-то другое написал. У меня проблема чисто архитектурная. Хуй с ними с замыканиями, это я обдолбался вчера. Проблема в том, что у меня древовидные зависимости между компонентами, но в одном месте компонент компонент надо передавать вниз, в обратном направлении. Специально для подобного у меня есть один кусок мутабельного состояния, но мне приходится пихать в него типа служебные данные (тот самый компонент, который вниз надо передавать), что как бы не очень красиво. А может и нормально, хз.
Аноним 28/11/17 Втр 22:21:15  1099772
>>1099367
С посылом твоего поста согласен, но все же я бы не был столь категоричен. Паттерны - это еще не понятые абстракции. То есть я говорю не об ооп-паттернах, которые суть сборник копипасты, а об общих архитектурных вещах, для которых (еще) нет стандартной, общепринятой и хорошо изученной абстракции.
Аноним 29/11/17 Срд 01:41:29  1099862
>>1099371
Прочитал.
Получается, что главная идея функционального программирования в отказе от мутабельных структур данных, т.е. иммутабленость ради иммутабельности?
Аноним 29/11/17 Срд 01:48:34  1099868
>>1099862
> иммутабленость ради иммутабельности?
Вот когда-нибудь устроишься на работу, сделаешь пару проектов - тогда и поймешь, ради чего нужна иммутабельность, сириусли. Ну или не поймешь, если рефлексировать не будешь.

Серьезно, чувак, 2018 на дворе - об этом столько уже написано и сказано, что всерьез воспринимать такие вопросы крайне затруднительно. Не траль, пожалуйста.
Аноним 29/11/17 Срд 02:02:12  1099871
>>1099260 (OP)
>>1099769

> древовидные зависимости между компонентами
> компонент компонент надо передавать вниз
> приходится пихать в него типа служебные данные

Я бы сделал наверное как:
1) Всю древовидную залупу обернул в сущность, которая предоставляет КОНТЕКСТ.
2) Сделал бы стороннюю функцию высшего порядка, которая умеет ТОЛЬКО доставать из КОНТЕКСТА некие значения, и перредавать их дочерним функциям
3) Юзал бы компоненты и в хуй не дул
4) Если компоненту нужен КОНТЕКСТ, я бы оборачивал его в ту самую херню из п2 и она бы предоставляла ему некое подмножество КОНТЕКСТА какими нибудь опциональными аргументами. Желательно чтоб компонент и без нее работал.

Это одно охуенно большое замыкание, да, но ключевое тут что оно ОДНО, и мало coupling. Компоненты работают сами по себе, контекстопредоставляющие хуйни сами по себе. Всем похуй друг на друга и все счастливы.

И да, если вдруг в контексте значится, что iDidNotFuckYourMom, это лишь значит, что он пиздит.
Аноним 29/11/17 Срд 02:05:22  1099873
>>1099862
не, братан, не только. Мы просто хотим чтоб операции, которые нормальные люди выполняют за O(1), выполнялись за O(log n). Например, просто запросить данные :3
Аноним 29/11/17 Срд 02:42:29  1099884
>>1099871
У меня примерно так и было, да. И примерно так и есть сейчас, с одним но: контекст и древовидная залупа - это разные сущности. Контекст - это, грубо говоря, один из компонентов залупы, просто без всякой логики. Там смотри в чем фишка, этот контекст (ссылка на него) нужен компоненту А, от которого зависят все другие компоненты. Но при этом другие компоненты могут добавлять в контекст свои хуевины, которые потом должны мочь использовать функции из компонента А. Ну то есть тут никак не получается контекст сделать иммутабельным, и это, конечно, хуево, потому что в идеале бы хотелось, чтобы компоненты могли в контекст сами пихать свои мутабельные штуки со своей семантикой. Ну разве что делать сложный лайфсайкл всем компонентам: сперва инит, в котором компонент А недоступен, но доступна уже инициализированная (другими компонентами) часть контекста. Инит возвращает новый контекст. А потом уже старт, в котором доступны и контекст, и компонент А (шина это короче, хуль я как дебил его "компонент А" называю, блядь). То есть порядок инициализации такой: контекст, все компоненты, шина. Хм, а "старт" вообще-то можно и не делать частью лайфсайкла - шина ж уже есть, можно тупо слать компонентам сообщение, и пусть они сами уже делают, если им что-то надо.

Блядь, чувак, вот спасибо, наконец-то сел спокойно на 2 минуты, подумал и написал.
Аноним 29/11/17 Срд 02:43:34  1099885
>>1099873
>O(log n)
ДЛЯ n < 42!!!!11 ВСЕ РАВНО КОНСТАНТА!! МНЕ НИПИЧЕТ!!!!1111
Аноним 29/11/17 Срд 02:48:22  1099886
Достопочтенные господа функциональщики итт, могут объяснить человеку с процедурщиной головного мозга, чем паттерн матчинг принципиально отличается от условных конструкций switch\case if\else?
Аноним 29/11/17 Срд 03:00:38  1099887
>>1099886
Ничем не отличается. И именно поэтому его перенимают нормальные языке программирования.
Аноним 29/11/17 Срд 03:02:19  1099888
>>1099886
Во-первых, он тупо удобнее.

Во-вторых, он по-настоящему статически типизирован. Если ты матчишь что-то, то внутрь конкретного clause'а передается тип сматченного объекта. То есть если ты сматчил, например, список или non-null, то компилятор знает, что в этой ветви кода вот это значение имеет соответствующий тип (непустой список или не нулл объект).

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

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

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

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

Итого: это обобщение свитчей и ифов с эффективной реализацией, которое удобнее использовать на практике.

Когда постигнешь дзен, приходи за второй частью поста (концептуальной) - о том, чем паттерн матчинг плох.
Аноним 29/11/17 Срд 03:07:05  1099892
>>1099888
Короче говоря, вся его польза только для тех языков, где компилятор заранее знает всё об окружении (статическая типизация, например). Для динамики разницы никакой, верно?
Аноним 29/11/17 Срд 03:08:14  1099893
>>1099892
Нет, неверно.
Аноним 29/11/17 Срд 03:10:12  1099895
>>1099888

>Во-вторых, он по-настоящему статически типизирован
А если язык динамический?

>Там, где с обычными условиями тебе придется писать лапшу из тонны вложенных ифов
whatever_check(x)
Аноним 29/11/17 Срд 03:12:08  1099896
>>1099893
Очень конструктивно, если учесть, что половина аргументов были основаны на том, что не походит для динамических языков.
Аноним 29/11/17 Срд 03:14:21  1099897
>>1099895
>А если язык динамический?
То остаются все пункты, кроме второго (на самом деле, и второй тоже остается, потому что тайпхинты проще генерировать).

> whatever_check(x)
Либо разговаривай полными предложениями на русском языке, либо ожидай, что тебя рано или поздно пошлю нахуй.

>>1099896
> половина аргументов были основаны на том, что не походит для динамических языков.
Перечитай пост еще раз. Если что-то непонятно - можешь спрашивать. Хотя вообще, желательно прочитать хотя бы ` https://en.wikipedia.org/wiki/Pattern_matching `, прежде чем спрашивать.
Аноним 29/11/17 Срд 03:15:01  1099898
пошлют
-- важный быстрофикс*
Аноним 29/11/17 Срд 03:15:37  1099899
*пошлют
-- важный быстрофикс
абу пидор
Аноним 29/11/17 Срд 03:16:01  1099900
>>1099897
Какой же ты ЧСВшный обмудок, хоспаде.
Аноним 29/11/17 Срд 03:17:20  1099901
>>1099900
Обсуждать меня или других анонов можно в /soc, здесь же обсуждают программирование. Если у тебя больше нет вопросов, то скажи спасибо и покинь тред.
Аноним 29/11/17 Срд 07:51:05  1099950
>>1099892
>Для динамики разницы никакой, верно?
Если бы в динамическом Эрланге не было бы паттерн-матчинга, то можно было бы повеситься, описывая всякие протоколы педерачи данных.
Аноним 29/11/17 Срд 09:01:05  1099969
>>1099886
Всем.
Аноним 29/11/17 Срд 09:07:04  1099970
>>1099895
>А если язык динамический?
Не бывает.
Аноним 29/11/17 Срд 12:45:06  1100022
>>1099260 (OP)
>Паттерны функционального программирования обсуждать тут
А хуле там обсуждать-то? Все что можно - смоделировал с помощью ADTs, заебенил нужные трансформации чистыми функциями, получение данных из внешних источников присобачил сбоку. Просто, как палка.
Скажи, а что ты за задачу решаешь с деревьями компонентов? Вротенд пишешь небось?
Аноним 29/11/17 Срд 12:55:24  1100024
>>1100022
>заебенил нужные трансформации чистыми функциями
В чем выражается "чистота" функции, каков критерий?
Если функция в процессе своего выполнения задействует функцию для промежуточных преобразований из внешнего окружения - он уже не является чистой?
За истину примем, что выполнение этих функций не приводит к изменению данных.
Аноним 29/11/17 Срд 13:39:23  1100033
>>1100024
>За истину примем
Не примем.
Аноним 29/11/17 Срд 13:44:16  1100035
>>1100033
>Не примем.
Что так?
Есть противоречия?
Аноним 29/11/17 Срд 13:52:20  1100042
>>1100022
>Просто, как палка.
Манька из башни из слоновой кости капчует?

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

>>1100024
>В чем выражается "чистота" функции, каков критерий?
Иди нахуй википедию читать.
Аноним 29/11/17 Срд 13:58:33  1100047
>>1100042
>Иди нахуй википедию читать.
Читал, и не только википедию. В одних случаях авторы пишут, что критерию чистоты удовлетворяет тот факт, что функция не изменяет данные, в другом, что не изменяет данные И не использует окружение.
Или понятие чистоты функции не является языконезависимым?
Я ж не ради срача, есличо.
Аноним 29/11/17 Срд 14:49:54  1100068
>>1100047
Он тебе не сможет объяснить. Так же как не смогли те, кого ты читал. У всех функциональщиков собственное представление тех или иных вещей, которое они даже не способны сформулировать. Это как фингербокс.
Аноним 29/11/17 Срд 18:34:08  1100165
>>1100047
>Я ж не ради срача
Ну тогда ладно.

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

Про окружение - та же фигня. Ты, я так понимаю, под "окружением" понимаешь вообще все - то есть все ранее определенные функции, например. Ну, при таком подходе, разумеется, все функции будут грязными, ибо им типа неявно передается энвиронмент, и вообще они неявно зависят от примитивов компилятора. Но это же идиотский и бесполезный notion. Разумеется мы считаем, что если функция использует только чистые функции, то она и сама чистая. Если тебя это так корежит, считай, что компилятор переписывает любое определение функции так, что она принимает один дополнительный аргумент - тот самый энвиронмент, где хранятся все ранее определенные функции.

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

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

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

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

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

>>1100068
Говна поешь, собака.
Аноним 29/11/17 Срд 19:21:24  1100187
>>1100165
Спасибо за детальный и грамотный ответ.
Отдельная благодарность за пояснение
> функция может внутри себя создавать и изменять временные мутабельные структуры (в качестве оптимизации, например), но эз лорг эз она референшиали транспарент, всем на это похуй
Аноним 30/11/17 Чтв 02:24:05  1100351
>>1100187
Пожалуйста.
Аноним 01/12/17 Птн 22:03:22  1101241
try it, youll l[...].png (688Кб, 1000x768)
Аноним 04/12/17 Пнд 16:43:48  1102817
Как совмещать ооп-дизайн с фп-дизайном? В той же скале, например.
Аноним 08/12/17 Птн 00:33:03  1104824
>>1099260 (OP)
Аноним 08/12/17 Птн 01:09:14  1104831
>>1102817
Никак. На это способны только настоящие джедаи высшего совета, типа Одерского и ещё пары человек. Остальные пытаясь совмещать ООП и ФП закономерно нахлёбываются урины.
Аноним 08/12/17 Птн 01:12:07  1104834
>>1099886
Тем , что это совершенно разные вещи.
Аноним 08/12/17 Птн 01:54:39  1104840
>>1104831
Ну я же не про дизайн языка говорил, а про использование.

Ок, вот смотри. У меня есть неймспесы, а в неймспейсе функция, которая возвращает главную структуру для этого неймспейса. Ну, в ооп это был бы конструктор. То есть у меня модуль My.Stuff.Foo, и в нем условно объявлена data Foo, и функция foo opts = Foo init...with...opts, нутыпонел. И в итоге получается как-то уебищно - везде это foo: Foo.Foo, Foo.foo, etc.

Как сделать красиво?
Аноним 08/12/17 Птн 02:05:58  1104844
>>1104840
Я тоже говорю про использование.
И я нихуя не понял в твоём примере. Если ты пишешь в ООП стиле, просто используй конструктор, или объект-компаньон, а если в ФП , то я вообще не понял в чём у тебя проблема.
Аноним 08/12/17 Птн 09:42:10  1104900
>>1104844
В том, что некрасиво, я же написал. Прочитай внимательно, я же подробно все описал.

Алсо, где я возьму в х-ле конструктор, ты чего.
Аноним 08/12/17 Птн 10:10:47  1104906
>>1102817
Посмотри CLOS
Аноним 08/12/17 Птн 11:25:19  1104929
>>1099260 (OP)
Ебашь, они нихуя не сделают!
Аноним 08/12/17 Птн 13:23:49  1104964
>>1099873
>Один из тех долбоебов-байтоебов, программы которых имеют свойство крошиться и течь после серии продожительной разработки и отладки?

Аноним 08/12/17 Птн 17:23:03  1105068
>>1099873
1.
log(2) = 1
log(2 000 000 000) ~= 30.89
ПИЗДЕЦ ТРАГЕДИЯ
2. Думаешь константы (в смысле реальное время выполнение операций) в реальном коде будут меньше или больше порядка разницы в п.1?
Аноним 09/12/17 Суб 09:24:02  1105308
>>1104906
Да не, речь вообще про другое.
Аноним 09/12/17 Суб 09:24:43  1105309
>>1105068
Двачую вот этого.
Аноним 10/12/17 Вск 01:06:49  1105689
>>1099557
Так вот все эти алгебраические и теоретикокатегорные сущности типа функторов, монад, групп, моноидов, сетоидов и т.д. и т.п. - те же паттерны, только строго формализованные (чем и отличаются в выгодную сторону от "ООП-паттернов")
Аноним 10/12/17 Вск 01:07:16  1105691
>>1099367
Полную хуйню списданул
Аноним 10/12/17 Вск 01:27:23  1105694
>>1105689
>те же паттерны, только строго формализованные
>та же вода, только сухая
>те же нигеры, только белые
Аноним 10/12/17 Вск 04:10:01  1105715
>>1105691
Сам дурак.
Аноним 10/12/17 Вск 04:11:29  1105716
>>1105689
Ну давай доказывай уже начинай.
Аноним 10/12/17 Вск 09:37:25  1105742
>>1102817
Используешь классы как иммутабельные типы данных в других фп языках и одновременно как модули из ML
Аноним 11/12/17 Пнд 05:16:45  1106172
Captured1.png (81Кб, 533x641)
>>1099260 (OP)
Чтобы скачать книгу, воспользуйтесь поисковой машиной www.entireweb.com — Гугл все сайты с ней забанил.

[Назад][Обновить тред][Вверх][Каталог] [Реквест разбана] [Подписаться на тред] [ ] 62 | 3 | 24
Назад Вверх Каталог Обновить

Топ тредов
Избранное