доня.
в том-то и прикол, что не совсем тогда было бы несколько проходов по коллекции, а трансдьюсеры устроены так чтобы проход был один
доня.
это не тот map
доня.
сейчас, статью кину
доня.
https://habrahabr.ru/post/325388/
分解物質
почему не должно?
к тому и мой посыл: языки которые строго ограничивают твой набор путей решения проблем определённой парадигмой они на любителя
доня.
к тому и мой посыл: языки которые строго ограничивают твой набор путей решения проблем определённой парадигмой они на любителя
ну это ты сам с собой тогда разговариваешь, речь шла о ФП а не о чисто функциональных языках
доня.
ну вроде того только эти map и filter не проходятся по коллекции, а возвращают либо значение чтобы передать дальше по цепочке, либо специальное значение означающее что нужно вообще прекратить проход по коллекции (нужно например для take(n), берущего первые n значений коллекции - на трансдьюсерах ненужные значения начиная с n+1-ого уже не будут вообще обработаны, никакими мапами и фильтрами)
Vladimir
О круто, у вас тут курс по ленивым итераторам в расте?
доня.
короче это на самом деле классный способ обрабатывать коллекции в функциональном стиле с минимальным (по сравнению с цепочкой .map().filter() и т. д.) оверхедом, для которого очень хорошо работает композиция
доня.
на самом деле как раз хотел написать что с ленивыми итераторами смысла в трансдьюсерах меньше, но все равно в плане композиции они лучше, так что смысл-таки есть
Alex
наверное нет
Alex
ведь ленивые итераторы достаточно быстры.
доня.
ну, можно померить конечно, не думаю что трансдьюсеры в Rust будут заметно медленнее чем ленивые генераторы работать потом, как я уже сказал, смысл ведь не только в скорости, но и в композиции
Vladimir
Если "Трансдьюсер — функция, которая принимает один редьюсер и возвращает новый ", то в чем будет отличие от ленивых итераторов?
Vladimir
Все методы итераторов принимают на вход один итератор и возвращают другой, добавляя логику.
доня.
трансдьюсеры получше композируются, пожалуй
Vladimir
Короче как я понял трансферы это те же итераторы ленивые только внешние? https://medium.com/@veedrac/rust-is-slow-and-i-am-the-cure-32facc0fdcb
Vladimir
Не понимаю в чем композиция лучше
доня.
есть .filter_map()
ну а если куча фильтров, какой-нибудь take и что-нибудь ещё
Danila Matveev
а где логи?
Наткнулся наконец
分解物質
второй вариант проще, быстрее и понятнее
պլհկ
Вот бы ща вложенных циклов понаписать
分解物質
分解物質
нельзя
тыж сам пример привёл
доня.
ну если ты до конца сообщение не можешь прочитать то это не мои проблемы что ты не самый умный кексик в корзиночке
Anonymous
>fib = lambda n:reduce(lambda x,n:[x[1],x[0]+x[1]], range(n),[0,1])[0] tfw парсер языка не умеет в строки и тебе придется развернуть это говно на первом None has no key... tfw ты хочешь писать как взрослые дяди на статике которая их спасет от большенства проблем и подскажет но у тебя питон
Anonymous
не знаю пересекаетесь ли вы с этими ребятами, но
stalkerg
я только про Си видел... с плюсами реально много боли, собственно для всех языков.
Vlad
Ребят, можете подсказать либо дать ссылку почитать, как выдавать просто сообщение об ошибке, если возник Err, не возвращая тут f64: let s: f64 = match string.trim().parse() { Ok(num) => num, Err(_) => { println!("Error"); 0.0 } };
Loo
panic! ?
Sherzod
Panikuy
Vlad
А реально вывод в коноль сделать чем-то более сексуальным, чем thread 'main'...?
Vlad
В смысле, я бы хотел видеть просто текст "Ошибка", без всей лишней информации
Sherzod
Ну не возвращай 0.0, а завершай программу
Vlad
Это только хуже
Oleg
Если в этом месте тебе не надо завершать программу, возвращай Result<f64, E>
Oleg
Пусть коллер решает что делать
Oleg
Все варианты перечислили, других просто нет
Vlad
Если в этом месте тебе не надо завершать программу, возвращай Result<f64, E>
Ну этот выглядит более-менее достойным, пожалуй. Всем спасибо.
Alex
Ну этот выглядит более-менее достойным, пожалуй. Всем спасибо.
Option/Result это базовые вещи, советую освоить книжку по расту, оно того стоит.
Vlad
Я её и осваиваю
Vlad
Я по главам где-то на первой (а нет, на третьей), просто хотел поэкспериментировать, ну и вот
Alex
я тоже в первой книжке пытался экспериментировать, пока все не прочёл во второй книжке - получалась всякая фигня.
Vlad
Я вторую читаю)
Alex
особенно &str меня веселили, сколько же у меня боли было. А оказалось это вообще особенный тип
Vlad
Достаточно много непривычных и новых вещей, но они и стараются исправляться
Filipp
мне казалось об этом даже в книге написано на первых страницах
Oleg
Почему?
Zero-cost abstractions - одна из фич языка. Не знаю, честно, насколько она исполняется.
Sherzod
Разве зерокостабстрактионс применима к функциям? Сам раст это разворачивает или ллвм?
Oleg
Разве зерокостабстрактионс применима к функциям? Сам раст это разворачивает или ллвм?
Полагаю, применима до тех пор, пока функции диспатчатся статически и компилятор умеет их инлайнить
Sherzod
Я думал что ZCA к оптимизации кода отношения не имеет
Sherzod
Точнее одно и то же, но в разных местах
Anton
https://rust.godbolt.org Попробуйте скомпилировать тут функцию с map и filter с флагом -O
Cuno
Если говорить о rust, то оверхеда у map().filter() быть не должно.
Речь о комбинаторах итератора, если что.
Cuno
т.е. этот код: https://github.com/rust-lang/rust/blob/master/src/libcore/iter/mod.rs
Anton
pub fn is_whitespace(text: &str) -> bool { text.chars().all(|c| c.is_whitespace()) } Вот такое он в одну функцию всё разворачивает
Anton
И там большая часть действий — какой-то хэндлинг юникода
Filipp
погоди они же ленивые
Cuno
Тут нет коллекций. Есть итераторы.
Anton
Это один цикл получается
Filipp
в расте собственно проход по циклу происходит в методе .collect()
Filipp
или вы про другое?
Anton
filter — это по сути просто if внутри цикла
Max
https://moikrug.ru/vacancies/1000034529 Опа
vladislav
единственная вакансия на hh для rust которую я видел
Fedor
https://moikrug.ru/vacancies/1000034529 Опа
вот это внезапно!
Fedor
а я то думал раст только для развлечения и опенсорса
Fedor
а за него еще и платят
Anton
Я как доберусь до компа, компильну, а потом декомпильну в сишный код
Anton
Можно будет сравнить
Anton
Руками)