с закрытием файла до раннего - PullRequest
0 голосов
/ 02 мая 2018

После запуска следующий код

withFile "file.txt" ReadWriteMode 
  (\h -> hGetContents h >>= putStrLn >> hGetContents h >>= putStrLn)

Я получаю содержимое file.txt только один раз, а затем получаю следующее исключение:

*** Exception: file.txt: hGetContents: illegal operation (handle is closed)

Почему Haskell закрыл файл так рано, что я не смог выполнить все нужные действия? В документации написано

Дескриптор будет автоматически закрыт , когда вычисление вернет .

что в данном случае не так.

Почему он так себя ведет и как объединить несколько операций ввода-вывода в один обработчик?

1 Ответ

0 голосов
/ 02 мая 2018

hGetContents переводит дескриптор файла в полузакрытое состояние. Все явные операции с этим дескриптором недопустимы после этой точки. Это не имеет ничего общего с withFile; вы просто не можете использовать hGetContents на одной и той же ручке дважды.

Как правило, вы хотите либо использовать ленивый ввод-вывод (например, readFile), или использовать явный ввод-вывод повсеместно (используя withFile и друзья). Желательно последнее. Попытка смешать оба, вероятно, приведет к проблемам.

В общем, ленивый ввод / вывод хорош для быстрого создания прототипов, но имеет довольно много недостатков с точки зрения прогнозирования, когда ресурсы ОС будут высвобождены.

...