Re[12]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 01.09.04 11:50
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, Gaperton, Вы писали:

S>>> Там вроде бы yield придумали в версии 2. Специально для ленивых циклов.
G>>Сомнительно. Если этот yield будет иметь ленивую семантику, это будет означать неопределенный порядок вычислений. Что не является граблями только в случае, если программа состоит из чистых функций (если побочные эффекты отсутствуют). Вот собственно и все — ленивые вычисления безопасны только при отсутствии побочных эффектов, а это и есть основная отличительная характеристика ФЯ.
S>Ну, я так понял, что нифига там ленивые вычисления не безопасны. Надо самому следить за порядком вычислений, либо за отсутствием побочных эффектов у yield.
Я тоже понял именно так. Грабли это серьезные, имхо, хоть и действительно кажется заманчивой идеей. Тяжело писать на С# в функциональном стиле, и еще тяжелее доказать безопасность побочных эффектов. А уж гарантировать ее в затяжной разработке — будет вообще кошмар. Кто-то сделает безобидное изменение, а трое других будут неделю искать возникший глюк.

S>Yield всего лишь облегчает реализацию итераторов, которые и в императивном случае вполне ленивы.

Итераторы были-бы ленивыми, если бы значение элемента контейнера вычислялось в момент доступа к нему по итератору, т. е. было отложенным до момента чтения. Ух, какие это жесткие грабли в ИЯ! Брр!

А так — вовсе они не ленивы.

S>Никто мне не мешает и на C# 1.0 написать итератор, который возвращает числа Фибоначчи. Вместе с классом Fibonacci :IEnumerable, который этот итератор возвращает.

Ну, в общем случае — да. Никто не мешает так писать, и это в целом хороший стиль.

S>А также написать алгоритм, который получает на вход IEnumerable и проверяет, больше ли сумма ряда предопределенной константы. yield просто делает код короче.

Возможно.

S>Конечно, честные функции высшего порядка мы так не получим.

Nemerle. Получите, если захотите взять
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.