169 похожих чатов

Мне кажется я неправ. Подтвердите или опровергните, пож. Я заметил, что

все время пытаюсь пихать странные оптимизации.
Например у меня есть мапа, и мне надо пробежаться по ее элементам, какие-то из них надо поменять, а какие-то удалить.
Ну я думаю: чего два раза бегать по мапе, если можно за один раз все сделать? И начинаются всякие толстые reduce, упрощенно
Enum.reduce(map, map, fn {k, v}, map ->
case k do
{1, d} -> Map.put(map, k, v + d)
{2, _} -> Map.delete(map, k)
end
end)
В более сложных случаях все превращается в лютое нечитаемое говно.

Напрашиватеся другой вариант:
map
|> Enum.map(fn
{{1, d} = k, v} -> {k, v + d}
e -> e
end)
|> Enum.filter(&match?({2, _}, &1))
|> Enum.into(%{})
Он куда более понятен, но тут бегаем фактически три раза. В ленивом хацкеле бегалось бы один раз, но тут наверняка три раза будет.
Но с другой стороны и хер бы с ним, мапы небольшие, может сотня-другая пар максимально.

Что скажете?

15 ответов

13 просмотров

Я думаю можно поискать в сторону кложурных трансдьюсеров https://github.com/garyposter/elixir-transducer

First, make it correct. Then, make it beautiful. Then, if you need to, make it performant. Because 9 times out of 10, making it beautiful also makes it performant enough.

Dima
Я думаю можно поискать в сторону кложурных трансдь...

Лучше просто использовать Stream, который делает абсолютно всё то же самое, только без DSL

Евгений- Автор вопроса
Евгений
Интересная штука. Спасибо!

Репозиторий покрыт пылью, но там реализация очень маленькая и интересна само направление мысли.

Пиши так, чтобы было быстро писать и читаемо другим

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

Евгений- Автор вопроса
Maksim Lapshin
Пиши так, чтобы было быстро писать и читаемо други...

Да фиг с другими, я один пишу. И сам с трудом вникаю через неделю :D

Евгений- Автор вопроса
Fried Zucchini
вообще надо было сначала filter, а потом уже map, ...

А какая разница? Типа после фильтра список может стать короче? :)

Есть же Stream

Евгений- Автор вопроса
Tharin
Есть же Stream

Он тормозной

Евгений
Он тормозной

А ты куда-то спешишь?

Евгений- Автор вопроса
Tharin
А ты куда-то спешишь?

Нет, но зачем Stream, когда есть Enum?

Евгений
Нет, но зачем Stream, когда есть Enum?

Если нужен fusion конвейра, то это как раз Stream, но для "маленьких" объемов он не эффективен, да.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Карта сайта