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