metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-03-28 05:20 pm

Ленивость+побочные эффекты

Второй день созерацию результаты "отсутствия монады IO, нечистоты и опциональной ленивости" в F#. Читаю из базы данных структуру данных ленивым образом - какой-то только, прости меня господи, херни не творится при этом. То значение прочитается после закрытия DataReader из которого оно читается, то команда окажется закрытой уже. Хорошо хоть в контексте коннекта и транзакции я уверен - вся работа происходит внутри их.

Предполагаю, что при определенном уровне сложности проще все будет сделать неленивым и всасывать в память, чем разбираться в стеках вызовов в которых половина фреймов - из автосгенеренных классах с малопонятными именами. Отладчиком по большей части этого всего пройтись невозможно - он не работает.

[identity profile] vp.livejournal.com 2010-03-28 05:30 pm (UTC)(link)
Ээээ.. Хотели ? Отгребите! :)

[identity profile] permea-kra.livejournal.com 2010-03-28 05:37 pm (UTC)(link)
Ребе, не читайте данных. Передайти в то, что их читает, функцию для свертки (fold) и сверните. Чудес сильно поубавиться.

[identity profile] gds.livejournal.com 2010-03-28 06:30 pm (UTC)(link)
fold посоветовали, он хороший, но будут заморочки в случаях, когда данных много, а остановиться надо рано (исключение кидать? возвращать Continue of result_t | Stop?).
Ещё есть with-идиома, где открытие и освобождение ресурса явные (освобождение -- опционально), и в читающую функцию передаётся уже открытый "дескриптор" (то есть, он не выбросится просто так, при сборке мусора). Это полезно ещё корректной обработкой исключений, если они вдруг используются в фа-диезе.
Но самое грамотное тут -- коиндуктивные данные (в окамле это модуль Stream и stream parsers). Есть и удобства а-ля "ленивые списки" (те самые stream parsers), есть и теория под ними, есть и гарантии о количестве используемых ресурсов (в отличие от ленивых списков), хороши и комбинаторы поверх них.
И соглашусь -- ленивый подход тут плох.

[identity profile] lionet.livejournal.com 2010-03-28 10:16 pm (UTC)(link)
Олеговые Iteratees надо заюзать, да. Как раз он пишет о том на что ты наткнулся: ленивость и внешние ресурсы работают плохо друг с другом. Альтернатива - Iteratees.