Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Gaperton, Вы писали:
G>>Хм, но в этом случае ты не получишь автоматического кэширования результатов (что ты имеешь бесплатно с ленивыми типами данных), это придеться делать руками.
VD>По сравнению с созданием класса реализующего итератор кэширвание просто фигня.
Не думал, что у вас создание такого класса представляет такую сложность

. А у нас — вот так:
fib = 1 : 1 : [ a+b | (a,b) <- zip fib (tail fib) ]
Напиши такое на шарпе, можешь даже воспользоваться yield. Посмотрим, позволяет-ли он определать рекурсивные типы данных. Да, кстати, насчет "не думал" — это я слукавил. Я весьма хорошо представляю себе, как это будет выглядеть (правда, без yield)
VD>К тому же в этом самом классе ты данные и будешь кэшировать. Кэшировать то нужно один элемент.
Ответ неправильный. Иногда необходимо кэшировать предыдущие. Этот пример вычисляет фибонначи эффективно — сложность O(N), как раз благодаря кэшированию серии элементов (которое происходит абсолютно прозрачно). Синклеру приводил пример, когда кэшировать надо вообще все:
http://www.rsdn.ru/Forum/Message.aspx?mid=790607&only=1Автор: Gaperton
Дата: 02.09.04
.
VD>А вот как раз второй Шарп решает вообще все проблемы, так как тот самый yield устраняет как необходимость кэширования, так и создания рабочего класса.
Возможно. На самом деле "ленивые потоки" — наименее опасный вид ленивых вычислений. Это вполне можно включить в императивный язык, как синтаксический сахар и приятную мульку. Но и только.
Потому как насчет устранения необходимости кэширования — это еще бабка надвое сказала.
G>>В общем, сделать "ленивый" контейнер на C# можно, но надо смотреть в оба. Как бы потом не получилось в духе "я тебя породил, я тебя и убью".
VD>Ну, эта песня уже знакома. Ошибки бывают везде. Твое как бы чего не вышло — это желание не допустить логическую ошибку. Понятно, что программа с ошибкой и в африке правильно не заработает. Вот только и в фунициональном приложении логическую ошибку сделать не сложно.

К барьеру. Напиши код на С#, который имеет такую же характеристику, как приведенный код для фибонначи. А мы посмотрим, где проще ошибиться. Обрати внимание, что если я напишу
process1( fib ) + process2( fib ) + process3( fib )
то числа фибонначи все равно вычисляются один раз, а не три.