LINUX.ORG.RU
ФорумTalks

Про функциональные языки...

 geekporno,


1

1

Немного почитал про функциональные языки. Я с детства (черепашка, паскаль) сначала рисую блок-схемы. Хотя бы в голове. Т.е. Я думаю вот этими прямоугольниками и ветвлениями. Фанаты хаскеля умеют их изощренно транслировать, или научились мыслить как-то по-другому?

Судя по разгребаемому мной js, большинство фронт-эндеров страдают, как и я, от асинхронности, но так кпк ничего лучше не видели, изобретают костыли.
Есть ли способ научиться планировать с конца/середины, и не оперировать моделями реальных объектов? Да, наверно, я поздно родился и мне надо программировать на коболе.

★★★★★

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

Я думаю вот этими прямоугольниками и ветвлениями. Фанаты хаскеля умеют их изощренно транслировать, или научились мыслить как-то по-другому?

риальне полезно постичь эту наркоманию для разминки мозга, зато потом на потуги хипстоты тянуще stream().map(Shit::new).collect(... в яву смотришь с умилением

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

для разминки мозга

О, в таком ракурсе не рассматривал.

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

хипстеры, сэр. ©

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

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

Я в яве вообще не разбираюсь (последний раз пробовал, когда jdk 1.1 был), но, кажется, она не под такую акробатику заточена.

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

Прям счас пишу извращенные запросы в mssql из экселя.

Ну и попробуй использовать Linq. Работа с массивами, списками и коллекциями с помощью SQL - тебе должно быть удобно

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

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

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

нужно юзать кастомный пул потоков

форкджоин вышел из моды или что там надо накастомизировать?

оборачивать таски для мониторинга

логов хватит не всем?

разве что для рассылки пинга по локалке

и блин уже хорошо ))

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

форкджоин вышел из моды

когдато входил?

что там надо накастомизировать?

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

в большинстве случаев еще придется threadlocal шатать

логов хватит не всем?

туда попадет время выполнения таски по мановению хвоста?

Deleted
()

Есть ли способ научиться планировать с конца/середины, и не оперировать моделями реальных объектов?

Обдумывать задачу разными парадигмами. ©

Фанаты хаскеля умеют их изощренно транслировать, или научились мыслить как-то по-другому?

«Зубастой Щуке в мысль пришло
За кошачье приняться ремесло.» :)

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

хипстеры, сэр.

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

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

и не юзать parallel если на 146% не уверен что ядер больше одного

да черт с ними с ядрами, натурально пингануть или опросить сотню url-ок. 100 потоков --- секунда + некоторые из них легко затупят, а вот 100 запросов последовательно...

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

100 запросов последовательно...

urls.forEach(url -> executorService.execute(() -> results.add(url.execute())))

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

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

накастомизировать?

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

и вот так каждый раз, я бы слился на таком вопросе при собеседовании ))

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

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

я кстати не знаю есть ли такой фокус, но если у нас фунциональщина, то имхо было бы неплохо иметь такой map: list.stream.map(profiler).map(method).collect

чтоб получил на вход параметр и ждал хэндлер. и внутри бы генерил логи.

есть такой?

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

list.stream.map(profiler).map(method).collect

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

возникает вопрос - нахрена оно тогда нужно?

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

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

дедлоки когда одна таска пула ждет другую которая сидит в очереди тогоже пула, а иногда - не сидит, как повезет 8)

ну так надо больше мапов :)

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

100 потоков --- секунда + некоторые из них легко затупят, а вот 100 запросов последовательно

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

а когда ядро всего одно - я проверял, это добро тормозит шопесец.

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

лишь там где есть чистые функции

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

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

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

в тексте программы писать лямбду

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

cat | grep | awk | sort

ну клева же.

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

если писать forEach то не будет создаваться итератор (в интерфейсах по дефолту он есть, но большинство реализаций его переопределяют)

а вот стримы - там все плохо

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

Не буду спорить, не смотрел. Но про потоки - я помню как довел ими приложение из серии «собери данные с 5 сайтов» до 6 секунд на запрос, просто пока жаба пыталась прожевать 6 стримов на 1 ядро. С обычным ExecutorService такой жести в тех же условиях не было

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

Я однажды 100 строк лупов заменил пятью вот такими вот стримами.

В 99% случаев это значит что ты не придумал как это сделать проще и красивее. У меня была такая фигня пока кажись белк мне про Map.computeIfAbsent не сказал, там таблицы из базы объединились по хитрой логике с результатами запроса к сайту

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

ну вот например:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b...

и также у keySet:

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b...

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

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

Я однажды 100 строк лупов заменил пятью вот такими вот стримами.

В 99% случаев это значит что ты [...]

Никогда не надо забывать, что 97.36% статистики - вранье.

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

не распознал мысль, если ты про хешсет, то там унутре хешмап банальный и можно было дернуть его foreach но поленились

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

не распознал мысль,

в плане реализация forEach логичная и без пачки дополнительных объектов. Указатель и отступ от начала

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

Непонятен профит замены 100 строк не самых понятных лупов 5ми понятными лямбдами?

если ты не можешь написать понятные циклы, то виноваты не циклы, очевидно.

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

Я для себя реальный профит лямбд увидел ТОЛЬКО в заворачивании итерируемого объекта в JSON объект другого формата.
Даже в pandas методе apply лямбды бесят, потому что не упрощают жизнь (читаемее описать функцию, которая делает apply, перед его вызовом), тем более, что для преобразований значений таблиц обычно нужна не ограниченная питоновская лямбда, а развесистая функция.

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

лямбда удобна для

context.call(() -> {...})

dbConnection.call(() -> {...})

и прочей мутотни с ресурсами, есть конечно `try with resources` - но он требует чтобы его не забыли и никто это не проверит, да и там надо полноценный объект реализующий closeable возвращать

а так например у меня есть объект прикрытый блокировками, чтобы не публиковать блокировку - я делаю

object.modify((builder) -> {builder.setProperty(val)})

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

зы. чуть не забыл, еще паттерн visitor, выше в forEach - был каноничный пример со ссылками что он стоит гораздо дешевле модных итераторов

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

Не убедительно, попробуй еще раз, например с примерами кода 8)

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

лямбда удобна для
context.call(() -> {...})

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

NextGenenration ★★
()

Я с детства (черепашка, паскаль) сначала рисую блок-схемы. Хотя бы в голове. Т.е. Я думаю вот этими прямоугольниками и ветвлениями

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

var items = arr.foreach(i => i.cell).filter(i => i.type == 1);

Имхо прочитать, написать и осознать этот вариант гораздо проще чем отдельно объявлять переменную, отдельно запускать цикл...

NextGenenration ★★
()
Ответ на: комментарий от NextGenenration
items = []
foreach elem in arr:
    if elem.type == 1:
        items.append(elem)

- СРАЗУ понятно, что происходит.

Мне не нужно, например, лезть в доки, чтобы выяснять синтаксис .filter() и особенности реализации стрелки.

Shadow ★★★★★
() автор топика
Последнее исправление: Shadow (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.