Oleg
Вот у меня две функции возвращают две таких итерируемых штуки, мне нужно их zip map sum
Oleg
И хотелось бы это всё за O(1) memory
Filipp
вполне здравое желание вернуть итератор. impl Trait реализует статический диспатч.
Oleg
И здорово было бы если бы ещё и за бесплатно
Filipp
помоему нет
Oleg
яс
Oleg
а какая бойлерплейтная альтернатива impl Trait? Сделать свой struct и для него аналогично реализовать Iterator?
Filipp
да
Filipp
В стандартном итераторе мап, фильтр и всякие такие методы так реализованы: https://doc.rust-lang.org/src/core/iter/mod.rs.html#1081-1084
Oleg
ну про стандартные я понимаю
Oleg
а можно для тупых, что значит "не запишу учитывая лямбды"?
а в расте каждое объявленное замыкание имеет свой собственный тип, который знает компилятор, а ты - нет
Oleg
т.е. функции и замыкания - это две разных вселенных, и вторые могут замыкаться на локальные переменные, но ты о них максимум знаешь имплементацию Fn ов, но не точный тип
Danila Matveev
грусть
Oleg
нуу zero cost
Oleg
зато он статически диспатчит
Danila Matveev
это конечно плюс, но не всегда нужный, имхо
Oleg
в расте не ставится под сомнение необходимость zero cost
Filipp
есть rfc чтобы лямбды без замыканий нормально можно было статически диспатчить тоже. unboxed closured называется
Oleg
https://github.com/rust-lang/rust/issues/18101 ?
Oleg
https://en.wikipedia.org/wiki/Anonymous_recursion
Danila Matveev
https://github.com/rust-lang/rfcs/blob/master/text/0114-closures.md это если верить реддиту
Filipp
интересно уже второй человек хочет вызвать лябмду саму из себя. Расскажи, на чем ты обычно программируешь?
Sherzod
js
Filipp
интересно как это работает
Filipp
а она замыкается типо сама на себя?
Oleg
интересно как это работает
динамический байндинг всего
Sherzod
А в c разве есть лямбды?
Filipp
в расте тоже можно сделать через указатели на функции
Sherzod
var f = function (fi) {fi(fi)}(fi); ?
Oleg
интересно как это работает
free variable динамически замыкаются на окружающий env, где лямбда присвоена какой-то переменной
Filipp
понял
Oleg
т.е. лямбда там может не только вызвать себя, то и изменить значение этой переменной, чтобы в следующий раз вызвалась не она
պլհկ
Пиши fn внутри fn
Filipp
ща попробую в расте так сделать
Oleg
ща попробую в расте так сделать
он скажет, что нет такой переменной
Filipp
но я ее определю раньше
Oleg
но я ее определю раньше
ну короче мне так и сказали, что через боксинг можно
Oleg
ещё раз кину ссылку на свои приключения
Oleg
https://stackoverflow.com/questions/42174338/write-fix-point-function-in-rust
Sherzod
Вот это треш )
Oleg
короче, да, мне предложили решение с Box<FnBox>
Oleg
если есть хотя бы один уровень боксинга - это нормально
Oleg
т.е. нужен какой-то динамический диспатч, хоть где-то, хоть немного
պլհկ
Остается только вопрос, нахуй это надо?
պլհկ
Делать странные кложуры
Sherzod
Циклом можно вычислять фибоначчи, зачем такой изврат?
Sherzod
тем более в том же цикле можно положить значения в вектор, и вернуть этот вектор )
Мерль
Хммм, я такую аргументацию постоянно вижу в Go сообществе <_<
Мерль
"Тебе это не нужно"
Oleg
Делать странные кложуры
Думаю, это тяжёлый переход с привычной нам функциональщины на ваше это железячное без гарбейдж коллектора, где регистры под ногтями застревают
Sherzod
Хммм, я такую аргументацию постоянно вижу в Go сообществе <_<
такой аргумент ты и шарповском сообществе увидешь
Sherzod
эх :( и я там был
Sherzod
Нужны более реальные задачи, я так думаю.
Мерль
Нужны более реальные задачи, я так думаю.
Написать интернет магазин на русте <_<
Fedor
ну я как-то видел CMS на C++
Fedor
ей можно пугать перед сном плохих программистов
Sherzod
Написать интернет магазин на русте <_<
Растоман пишет кмс на расте, если что ) Могу позвать
Oleg
ну если у тебя твоя рекурсия уже превращена в корекурсию, её можно хоть чем свернуть
Sherzod
ну я как-то видел CMS на C++
на асме еще есть )
Oleg
вопрос, как превратить так, чтобы свернуть можно было
Sherzod
https://board.asm32.info/
Sherzod
Ты на расте CMS пилишь?
Нет. Александр Ирбис что-то такое пилит
Danila Matveev
только корректность цикла надо через инварианты доказывать (в формальном варианте), а с хвостовой и так все вытекает из самого себя в общем второе для надежности лучше и для ревьювера
Oleg
ну вот мы и выясняем сейчас
Oleg
нет, это просто рекурсивный тип
Oleg
корекурсия - это способ записать вычисления, где из предыдущего (структурно меньшего) состояния определяется следующее (структурно эквивалентное или большее)
Oleg
в отличие от рекурсии, где структурно большее записывается через ссылку на структурно меньшее
Safort
Нет. Александр Ирбис что-то такое пилит
Судя по репе, у него только шаблонизатор https://github.com/alexander-irbis/incrust
Oleg
если говорить о типах, то рекурсия это когда List a = Nil | (a, List a) а корекурсия - это когда ListF a x = Nil | (a, X)
Oleg
первое можно получить из второго, например каким-нибудь List a = Fix (ListF a)
Oleg
соответственно вот это - корекурсивное определение
Oleg
ты мог бы не схлопывать его сразу, в пробежаться циклом
Oleg
или делать по одному действию за раз
Oleg
может даже асинхронно