2012-06-04 4 views
7

Я, вероятно, не очень хорошо разбираюсь в монаде IO.Haskell IO Monad и использование памяти

Если я пишу приложение, которое, как ожидается, будет работать в течение многих месяцев, тем временем выполнив его ход, будет ли модем IO хранить всю информацию журнала в ОЗУ до конца?

Из блога на IO Inside, модели Haskell мире как

main :: RealWorld -> ((), RealWorld) 

так, что IO не происходит во время выполнения Haskell части кода, но только тогда, когда приложение возвращает из main.

Возможно, я полностью неверно истолковал это. Может ли кто-нибудь объяснить , когда Haskell на самом деле делает IO?

ответ

8

Модификация IO будет хранить всю информацию журнала в ОЗУ до конца?

Нет. Вы не должны думать о «монаде IO» как о том, что совершает действия. Это всего лишь математический способ представления императивных программ. Примитивные императивные программы - это такие вещи, как getChar; >>= используется для склеивания двух программ вместе в большую императивную программу. Мода IO - это набор всех императивных программ.

Рассмотрим программу, такую ​​как

main = putStr "Hello, " >> putStrLn "world!" 

Это означает, что: main это программа, которая выполняет программу putStr "Hello, ", и когда это будет сделано, выполняет программу putStrLn "world!". Нет необходимости, чтобы интерпретатор Haskell или скомпилированная программа сохраняли любое состояние в памяти, за исключением указателя инструкции, то есть «где мы, и что мы выполняем дальше».

Возможно, метафора RealWorld -> ((), RealWorld) вас смутила, поскольку она, по-видимому, подразумевает преобразование состояния внешнего мира в новое состояние, которое должно быть вычислено целиком, после чего мир может быть обновлен, чтобы отражать вычисленное состояние. Это совсем не то, что происходит. Hikell wiki предупреждает об этом:

Следующая история об IO неверна в том, что она не может фактически объяснить некоторые важные аспекты IO (включая взаимодействие и параллелизм).

+0

Спасибо за приятное объяснение. Я прочитал «Learn You a Haskell» (в настоящее время во втором чтении раздела монады) и начал «Real-World Haskell». Если я не пропустил что-то, ничто не дает понять, что ИО происходит немедленно, но, как и другие монады, «накапливается» до конца.Думаю, мне нужно посмотреть на выходе ассемблера компилятора, чтобы убедить себя :-). – Ralph

+0

. Метафора «RealWorld -> ((), RealWorld), несомненно, подразумевает, что преобразование происходит в чистом виде и полностью испускается только в конце. Я полагаю, что базовые реализации операций ввода-вывода фактически выполняются «по требованию». – Ralph

+5

@ Ralph: Ключом к пониманию монады IO является то, что он накапливает * программы *, а не фактический ввод и вывод. Немногие учебники Haskell объясняют это хорошо. –

4

будет ли монада IO хранить всю информацию журнала в ОЗУ до конца?

Нет. Предполагая, что вы используете разумную стратегию ведения журнала.

Haskell выполняет IO, когда результат требуется вашей программой; который для большинства действий немедленно. (Исключение составляют ленивые библиотеки ввода файлов, где файлы не обязательно считываются, пока данные не будут использованы программой).

Смежные вопросы