Форум
Философия программирования
Тема
Как правильно задавать вопросы
B
I
abc
U
X
3
X
3
H1
H2
H3
H4
H5
H6
Asm
C/C++
C#
Erlang
Haskell
IDL
Java
Lisp
MSIL
Nemerle
ObjC
OCaml
Pascal
Perl
PHP
Prolog
Python
Ruby
Rust
SQL
VB
Здравствуйте, gandjustas, Вы писали: G>Здравствуйте, Воронков Василий, Вы писали: ВВ>>Вот честно, не флейма ради, но недавно подобный вопрос поставил меня в тупик. В качестве наглядного примера можно взять итераторы в C# или даже более продвинутую реализацию. Неважно. ВВ>>Фактически все задачи, которые выполняются через итераторы, не менее успешно выполняются и через функцию-замыкание. Насколько я понимаю, в том же Руби итераторы по сути и представляют собой некий сахар для подобного. ВВ>>Попробую объяснить, что я имею в виду. Положим, некий код вида: ВВ>>[c#] ВВ>>IEnumerable<Int32> Range(int start, int end) ВВ>>{ ВВ>> var e = end + 1; ВВ>> for (var i = start; i < e; i++) ВВ>> yield return i; ВВ>>} ВВ>>foreach (var i in Range(0, 100)) { ВВ>> //Do something ВВ>>} ВВ>>[/c#] ВВ>>Можно переписать вот так: ВВ>>[c#] ВВ>>void Range(int start, int end, Action<Int32> fun) ВВ>>{ ВВ>> var e = end + 1; ВВ>> for (var i = start; i < e; i++) ВВ>> fun(i); ВВ>>} ВВ>>[/c#] ВВ>>Можно представить так и работу с бесконечными последовательностями, если действие будет описывать как Func<T,Int32,Boolean>, где второй параметр - порядковый номер элемента, а первый сам элемент. Возвращается же флажок, по которому определяются следует ли нам продолжать. Создавать такую функцию можно через простейший комбинатор вида: ВВ>>[c#] ВВ>>Func<T,Int32,Boolean> Create(Action<T> fun, int take) ВВ>>{ ВВ>> var t = take + 1; ВВ>> return (e, i) => { ВВ>> if (i < t) { ВВ>> fun(e); ВВ>> return true; ВВ>> } ВВ>> else ВВ>> return false; ВВ>> }; ВВ>>} ВВ>>[/c#] ВВ>>Т.е. с точки зрения юзабилити это, конечно, менее удобно, но вот, собственно, и все. ВВ>>В принципе у итераторов как частного случая корутин должны быть более широкие применения вроде как, но все, о чем я могу подумать, прекрасно выражается через ФВП. Причем вариант с ФВП отлично дружит с continuation-ами, с которыми те же C#-вые итераторы не дружат совсем. ВВ>>Т.е. итераторы просто сахар? Зачем они нужны? G>Ну как-бы исторический фактор. Сначала были сделаны IEnumerator\IEnumerable и сахар в виде foreach для них. Потом разработчики компиляторы подумали что писать руками итераторы слишком сложно и сделали сахар в виде yield return для них. G>Кроме того continuations в императивном стиле очень тяжело писать (без сахара вроде async\await).
Теги:
Введите теги разделенные пробелами. Обрамляйте в кавычки словосочетания с пробелами внутри, например:
"Visual Studio" .NET
Имя, пароль:
Загрузить
Нравится наш сайт?
Помогите его развитию!
Отключить смайлики
Получать ответы по e-mail
Проверить правописание
Параметры проверки …