Re[18]: Сильные стороны функционального программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 02.09.04 10:53
Оценка:
Здравствуйте, 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&amp;only=1
Автор: Gaperton
Дата: 02.09.04
.

VD>А вот как раз второй Шарп решает вообще все проблемы, так как тот самый yield устраняет как необходимость кэширования, так и создания рабочего класса.

Возможно. На самом деле "ленивые потоки" — наименее опасный вид ленивых вычислений. Это вполне можно включить в императивный язык, как синтаксический сахар и приятную мульку. Но и только.

Потому как насчет устранения необходимости кэширования — это еще бабка надвое сказала.

G>>В общем, сделать "ленивый" контейнер на C# можно, но надо смотреть в оба. Как бы потом не получилось в духе "я тебя породил, я тебя и убью".

VD>Ну, эта песня уже знакома. Ошибки бывают везде. Твое как бы чего не вышло — это желание не допустить логическую ошибку. Понятно, что программа с ошибкой и в африке правильно не заработает. Вот только и в фунициональном приложении логическую ошибку сделать не сложно.

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

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