LINUX.ORG.RU

что зачем и почему

 


0

1

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

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



Последнее исправление: Nirdeks (всего исправлений: 2)
Ответ на: комментарий от Nervous

Да, нет. Я как бы намекнул, что двоичная логика - это сильное упрощение для людей с квадратично-гнездовым мышлением, так как по-мимо двух состояний всегда есть МИНИМУМ еще промежуточное. И мышлление у нас визуальное… Мы в воображение все идеализируем. Ага вспоминаем задачи про пять яблок, а не про сложение абстрактных двух чисел. У нас из всех чувств только зрение хорошо развито, а остальные недоразвитые. Вспоминаем детские рисунуки. Что там видим? - Геометрические примитивы, те мы разбиваем все что видим на кружки, линии, многоугольники… Ага видеокарта такая. У вот у мозг по-большей части GPU, которое входе эволюции научилось что-то помимо полигонов обрабатывать… К чему я веду… Можешь назвать каких-то выдающихся не знаю физиков, математиков, писателей, которые родились слепыми и чего-то достигли… Вопрос риторический => мышление связано со зрением, с визуализацией слов, у тебя в голове существуют какие-то идеальные образы стула, стола, монитора и тп… И там еще мы научились и физику просчитывать каким-то надмозгом. Когда ты представляешь стул, то не представляешь как на нем будешь летать. И вот мы доходим до программирования… В общем программирование - это творчество, если у тебя есть способности к рисованию, к литературе… да просто развитое воображение… Расскажи лучше как функциональное программирование интеллект то разовьет? Ты если дураком родился, ты им и умрешь. И что точно, так это то, что люди с бинарной логикой в бошке - это идиоты такие же как придурки в комментариях на кажом сайте новостей.

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

Троичная логика, визуальное восприятие, развитие интеллекта — это все очень интересные вопросы, но при чем тут функциональное программирование? %) Где причинно-следственная связь?

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

Расскажи лучше как функциональное программирование интеллект то разовьет?

Да элементарно, Ватсон!
FP - это как получить похожий результат другим способом. Что даёт построение новых нейронных связей. Если тебе нужны исследования, то в свободном доступе можно найти альтернативу, проведённую на людях, знающих более одного языка (и проанализированы сами языки, Русский, Английскиий, Немецкий etc).

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

Когда ты представляешь стул, то не представляешь как на нем будешь летать.

Ну вот ТАК писать не надо. Образ напрямую связан с контекстом, голого стула у тебя в памяти нет. Когда тебе надо сесть, то ты не думаешь, а тянешься к стулу или просто задом на любую поверхность. Сознание включается на уровень мышления только тогда, когда сесть охота, а свободных стульев нет. Т.е. надо решать задачу.

Nirdeks
() автор топика

Какая парадигма преобладает?

OOP. Какие бы условия про умных людей не ставились) И да, уже сказали, что OOP не исключает FP. Могу еще добавить, что если ты сделал замыкание, или там вызвал map в джаваскрипте, то это еще не FP.

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

Могу еще добавить, что если ты сделал замыкание, или там вызвал map в джаваскрипте, то это еще не FP.

а что тогда FP?

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

Ты, как ОП и расскажи)

Ну давай возьмем из википедии

In computer science, functional programming is a programming paradigm where programs are constructed by applying and composing functions. It is a declarative programming paradigm in which function definitions are trees of expressions that map values to other values, rather than a sequence of imperative statements which update the running state of the program.

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

Не говоря уж о сути «map values to other values, rather than a sequence of imperative statements which update the running state of the program»

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

Во всех современных языках двоичная логика… Она противоестественна, но проста в реализации. А дальше уж рассуждения идут что-то основанное на чем-то в корне неверном что-то развивает. Ну ты можешь заучить какие-то паттерны, которые позволяют решить ту или иную проблему, но количество нейронов в твоем мозге от этого не изменится. Я веду к тому, что «выше головы не прыгнешь», у тебя есть «талант» от рождения (бога) либо его нет. А что там переменные вдруг стали неизменны и надо перестраивать ранее заученные трюки под это ограничение. Как оно умнее тебя сделает?

uwuwuu
()
Ответ на: комментарий от yu-boot

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

uwuwuu
()
Ответ на: комментарий от yu-boot

Я забыл, например, как в блендере модельки лепить. С велосипедом пример неудачный, потому как до определенного возраста тебе сложно даже ходить не «подпрыгивая», а равно и держать равновесие

uwuwuu
()

OOP или FP?

Зависит от языка программирования. FP удобнее для программиста, но значительно тяжелее для компилятора. И если писать на FP на языке, который его не поддерживает (например, Си++), будут адские тормоза.

То есть, если производительность некритична, то можно выбирать Haskell (если задача ложится на его систему типов) или какой-то из лиспов, например Racket (если нужна максимальная гибкость).

Если же производительность критична или надо писать для браузера, то только ООП.

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

Странное утверждение.

В С++ и JS ООП намного быстрее, чем ФП.

А почему Racket а не, допустим, CL?

Потому что CL намного более мультипарадигменный и это отражается на библиотеках. Там, где в Racket будут замыкания, в CL вместо них будут CLOS, макросы, динамические переменные и переопределение таблиц чтения. Один универсальный setf чего стоит (в Racket использование set! не приветствуется).

Я когда переходил с CL на Racket первые полгода пытался переизобрести «недостающие» библиотеки. Потом нашёл аналоги всего, что в CL активно используется, но к тому моменту понял, почему оно не нужно.

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

В С++ и JS ООП намного быстрее

Да ты …

А в шарпе, в шарпе быстрее? А то, понимаешь, сборщик мусора…

Потом нашёл аналоги всего, что в CL активно используется, но к тому моменту понял, почему оно не нужно.

А вот это интересный опыт. Ты бы статью, если есть время, закинул. Мне, да и большинству, было бы интересно.

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

А в шарпе, в шарпе быстрее? А то, понимаешь, сборщик мусора…

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

Разработчики компиляторов C++, C#, JS предполагают, что программист будет писать в стиле ООП и именно его оптимизируют. Кстати, SBCL тоже.

А вот это интересный опыт. Ты бы статью, если есть время, закинул. Мне, да и большинству, было бы интересно.

Вот про подход к ФП: Почему в scheme не любят set! ?

Вот общий вывод: Анализ пользователей Common Lisp и Racket .

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

О, за ссылки и разъяснения спасибо. Steel bank что? Я не понял, что тоже?

Тоже оптимизирует CLOS и defstruct, а не цепочки функциональных вызовов. Быструю программу приходится писать с setf. В Racket всегда есть функциональная альтернатива без потери скорости. Зато ООП в Racket имеет очень существенные накладные расходы (и используется только в графическом пользовательском интерфейсе).

Кстати, неплохая поддержка ФП, оказывается, есть в Rust:

https://github.com/brianwow/zero-cost-abstraction

https://habr.com/ru/articles/482318/

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

Хм. Я то думал, что с каждой версией компилятора это учитывают.

SBCL? Так даже в ANSI CL явно было указано, что основным стилем написания программ является императивный. Вплоть до того, что хвостовая оптимизация там необязательна.

С другой стороны, оптимизация функциональных вызовов заметно усложняет отладку (стек вызовов частично «исчезает»). А у CL одна из основ — сверхмощный отладчик.

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

За это и любим.

Вот именно. А если взять функциональные языки, то в Racket хвостовая оптимизация затирает стек. В результате пишешь

(define (f x) (+ (g x) (h x) (k x) 1))
(f 'bad)

получаешь ошибку car: contract violation. На стеке только f, + и car. Потому что в одной из g, h, k хвостовой операцией оказалась операция, у которой хвостовой операцией была car.

В Haskell ещё жёстче. Чистая ленивая функция просто хранит вычисления в данных.

y = f x
z = g y
print $ head z

Получаешь ошибку *** Exception: bad data со стеком print, head. Хотя сама ошибка bad data возвращена из f или g.

Поэтому в функциональных языках отладчик считается почти бесполезным, а вместо него контракты и модульные проверки (unit tests). В Haskell и Typed Racket ещё и типизация.

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