Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, Gaperton, Вы писали:
S>>> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.
G>>Сомнительно. Если этот yield будет иметь ленивую семантику, это будет означать неопределенный порядок вычислений. Что не является граблями только в случае, если программа состоит из чистых функций (если побочные эффекты отсутствуют). Вот собственно и все — ленивые вычисления безопасны только при отсутствии побочных эффектов, а это и есть основная отличительная характеристика ФЯ.
S>Ну, я так понял, что нифига там ленивые вычисления не безопасны. Надо самому следить за порядком вычислений, либо за отсутствием побочных эффектов у yield.
Я тоже понял именно так. Грабли это серьезные, имхо, хоть и действительно кажется заманчивой идеей. Тяжело писать на С# в функциональном стиле, и еще тяжелее доказать безопасность побочных эффектов. А уж гарантировать ее в затяжной разработке — будет вообще кошмар. Кто-то сделает безобидное изменение, а трое других будут неделю искать возникший глюк.
S>Yield всего лишь облегчает реализацию итераторов, которые и в императивном случае вполне ленивы.
Итераторы
были-бы ленивыми, если бы
значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения. Ух, какие это жесткие грабли в ИЯ! Брр!
А так — вовсе они не ленивы.
S>Никто мне не мешает и на C# 1.0 написать итератор, который возвращает числа Фибоначчи. Вместе с классом Fibonacci :IEnumerable, который этот итератор возвращает.
Ну, в общем случае — да. Никто не мешает так писать, и это в целом хороший стиль.
S>А также написать алгоритм, который получает на вход IEnumerable и проверяет, больше ли сумма ряда предопределенной константы. yield просто делает код короче.
Возможно.
S>Конечно, честные функции высшего порядка мы так не получим.
Nemerle. Получите, если захотите взять