доня.
в том-то и прикол, что не совсем
тогда было бы несколько проходов по коллекции, а трансдьюсеры устроены так чтобы проход был один
доня.
это не тот 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
Не понимаю в чем композиция лучше
Tomato
分解物質
分解物質
второй вариант проще, быстрее и понятнее
պլհկ
Вот бы ща вложенных циклов понаписать
Loo
分解物質
պլհկ
分解物質
Иммутабельно, функционально, красота:
const processFiles = compose(
map(doSomething),
filter(audio => fs.existsSync(audio.path))
);
into([], processFiles, audios);
Императивно, некрасиво, фу:
const processedFiles = [];
for (let audio of audios) {
if fs.existsSync(audio) {
processedFiles = doSomething(audio);
}
}
Прикол тут не в каких-то абстрактных строчках кода, а в том, что если я в другом месте программы захочу добавить что-нибудь к логике processFiles, в примере с трансдьюсерами я просто сделаю ещё один compose и получу новую функцию, а в императивном примере придётся писать цикл заново
А в цикле могут быть и не три строчки на практике
здесь
доня.
分解物質
нельзя
тыж сам пример привёл
доня.
ну если ты до конца сообщение не можешь прочитать то это не мои проблемы что ты не самый умный кексик в корзиночке
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
Vlad
Я её и осваиваю
Vlad
Я по главам где-то на первой (а нет, на третьей), просто хотел поэкспериментировать, ну и вот
Alex
я тоже в первой книжке пытался экспериментировать, пока все не прочёл во второй книжке - получалась всякая фигня.
Vlad
Я вторую читаю)
Alex
особенно &str меня веселили, сколько же у меня боли было. А оказалось это вообще особенный тип
Vlad
Достаточно много непривычных и новых вещей, но они и стараются исправляться
Cuno
Влод
Filipp
мне казалось об этом даже в книге написано на первых страницах
Oleg
Почему?
Zero-cost abstractions - одна из фич языка. Не знаю, честно, насколько она исполняется.
Sherzod
Разве зерокостабстрактионс применима к функциям? Сам раст это разворачивает или ллвм?
Sherzod
Я думал что ZCA к оптимизации кода отношения не имеет
Sherzod
Точнее одно и то же, но в разных местах
Anton
https://rust.godbolt.org
Попробуйте скомпилировать тут функцию с map и filter с флагом -O
Cuno
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
Fedor
а я то думал раст только для развлечения и опенсорса
Fedor
а за него еще и платят
Anton
Я как доберусь до компа, компильну, а потом декомпильну в сишный код
Anton
Можно будет сравнить
Anton
Руками)