Haskell ReadWriteMode дескриптор файла


Читая Learn You a Haskell, я обнаружил, что вы можете использовать ReadWriteMode в качестве третьего параметра для openFile.

Но должен ли он обрабатывать запись и чтение в файл? Я сделал несколько тестов:
import System.IO

main = do
    handle   <- openFile "myfile" ReadWriteMode
    contents <- hGetContents handle
    putStrLn contents
    hPutStr handle "Something"
    hClose handle

Однако это вернуло ошибку:

*** Exception: myfile: hPutStr: illegal operation (handle is closed)

Итак, в чем же смысл ReadWriteMode? Я ищу любые случаи в реальном мире, где это было бы использовано.

1 2

1 ответ:

Здесь есть кое-что, что, кажется, работает.

import System.IO
import qualified System.IO.Strict as SIO
import GHC.IO.Handle

slurp h = do
  h' <- hDuplicate h
  hSeek h' AbsoluteSeek 0
  SIO.hGetContents h'

main = do
    handle   <- openFile "myfile" ReadWriteMode
    contents <- slurp handle
    putStrLn contents
    offset <- hTell handle
    putStrLn $ "handle position: " ++ show offset
    hPutStrLn handle "Something new"
    hClose handle

System.IO.Strict это от самого strict пакет

Edit: возможно, вам даже не нужно использовать SIO.hGetContents - Просто hGetContents также, кажется, работает.