metaclass: (Default)
metaclass ([personal profile] metaclass) wrote2010-03-13 11:51 am
Entry tags:

Ссылка с planet haskell, IO monad

Теперь про IO.
В ссылке с прошлого поста товарищ жалуется на то, что IO монада лезет в любую дыру без мыла и заражает в итоге любую более менее осмысленную программу.

В этом плане я не совсем понимаю, почему в хаскеле эта монада - одна на все виды взаимодействия с внешним миром? Например, с моей точки зрения чтение и запись файлов совершенно отличается от обращения к серверу БД, что в свою очередь отличается от разговора с пользователем в консоли, что опять же отличается от взаимодействия в GUI, итд. Еще можно вспомнить работу по сети, работу с COM-портами, FFI итд.

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

Это я как-то размышлял на тему, "как бы выглядел хаскель, встроенный в СУБД в качестве языка запросов". Я с трудом могу перейти от размышления над обычной программой в стиле "запустили, ввели данные, получили результат" к постоянно запущенной программе, управляемой событиями типа "сервер, ждет запроса от клиентов" или "GUI приложение ждет нажатия кнопки пользователем".
И от "программа читает файл с состоянием, обрабатывает запрос и сохраняет файл обратно" к "программа живет с внутренним состоянием, которое обрабатывается интегрированным в компилятор/виртуальную машину/интерпретатор движком БД.
Реализация IO мешается в голове, а для СУБД нужна была бы еще одна монада (а может и не одна), отражающая внутреннее состояние, упорядочивающая действия с записями, транзакциями и взаимодействием между различными пользователями, лезущими к одним и тем же данным).

PS: Напомнили в комментариях - эта идея у меня возникла еще потому, что монада IO как бы таскает с собой "состояние внешнего мира". А это самое состояние - оно ни разу не монолитное, и его, если по хорошему, нужно разбить на несколько частей ("пользователь", "файлы", "базы данных", "сторонние системы").

[identity profile] voidex.livejournal.com 2010-03-13 07:34 pm (UTC)(link)
> Переполнить с помощью чистого вычисления ресурс "память", испортив жизнь других "монад" - запросто
Как?

не понял вопроса

[identity profile] nealar.livejournal.com 2010-03-13 08:41 pm (UTC)(link)
В stack overflow загнать чистым выражением как?

Re: не понял вопроса

[identity profile] voidex.livejournal.com 2010-03-14 08:45 pm (UTC)(link)
Ну, чистое выражение надо где-то начать вычислять.
Если мы вычисляем его в IO, и в IO же какие-то проблемы с памятью - беда беда. А если начали вычислять в BD, а в IO беда с памятью, а упало всё равно в BD, то что-то не так в датском королевстве.

[identity profile] blacklion.livejournal.com 2010-03-13 09:04 pm (UTC)(link)
Тупо породить список больше памяти. Вчера дали гиг — влезло. Сегодня дали полгига — не влезло. Программа чисто функциональная. Вчера работала сегодня — нет. Упс.

[identity profile] voidex.livejournal.com 2010-03-14 08:49 pm (UTC)(link)
Чтобы список породить, его надо где-то вычислить. Если в IO дали мало памяти и упало - то всё логично. А если в IO дали мало памяти, а упало в монаде BD, то уже нелогично.
Вот если у нас runBD :: BD a -> IO a, тогда наверное логично.
Но я вообще идею поста не очень понял. Т.е. саму идею понял, но детали очень важны, а их нет.

[identity profile] blacklion.livejournal.com 2010-03-15 07:15 am (UTC)(link)
Нет IO. Нет BD. Есть чистая функциональщина, которая с математико-теоретической точки зрения не зависит от внешнего мира а зависит только от парамтеров и возвращает только результат, никак не влияя на состояние мира. Но на самом-то деле — влияет, так как память у нас не резиновая и такты процессора не из воздуха берутся.

[identity profile] voidex.livejournal.com 2010-03-15 11:53 am (UTC)(link)
Без IO эта чистая функциональщина никакой памяти не отъест, для начала её нужно в это IO завернуть.

[identity profile] blacklion.livejournal.com 2010-03-15 01:20 pm (UTC)(link)
Да ну не отъест? Ленивая может и не отъест, а энергичная — очень даже.

[identity profile] voidex.livejournal.com 2010-03-15 03:12 pm (UTC)(link)
А мы уже не о Хаскеле?