Como leio (e analiso) um arquivo e anexo ao mesmo arquivo sem obter uma exceção?

Estou tentando ler um arquivo corretamente no Haskell, mas parece que recebi esse erro.

*** Exceção: neo.txt: openFile: recurso ocupado (o arquivo está bloqueado) Este é o meu código.

import Data.Char
import Prelude
import Data.List
import Text.Printf
import Data.Tuple
import Data.Ord
import Control.Monad
import Control.Applicative((<*))

import Text.Parsec
    ( Parsec, ParseError, parse        -- Types and parser
    , between, noneOf, sepBy, many1    -- Combinators
    , char, spaces, digit, newline     -- Simple parsers
    )

Estes são os campos do filme.

type Title = String
type Director = String
type Year = Int
type UserRatings = (String,Int) 
type Film = (Title, Director, Year , [UserRatings])
type Period = (Year, Year)
type Database = [Film]

Esta é a análise de todos os tipos para ler corretamente do arquivo

-- Parse a string to a string
stringLit :: Parsec String u String
stringLit = between (char '"') (char '"') $ many1 $ noneOf "\"\n"

-- Parse a string to a list of strings
listOfStrings :: Parsec String u [String]
listOfStrings = stringLit `sepBy` (char ',' >> spaces)

-- Parse a string to an int
intLit :: Parsec String u Int
intLit = fmap read $ many1 digit
-- Or `read <
-- Parse a string to a string
stringLit :: Parsec String u String
stringLit = between (char '"') (char '"') $ many1 $ noneOf "\"\n"

-- Parse a string to a list of strings
listOfStrings :: Parsec String u [String]
listOfStrings = stringLit `sepBy` (char ',' >> spaces)

-- Parse a string to an int
intLit :: Parsec String u Int
intLit = fmap read $ many1 digit
-- Or `read <$> many1 digit` with Control.Applicative
stringIntTuple :: Parsec  String u (String  , Int)
stringIntTuple = liftM2 (,) stringLit intLit

film :: Parsec String u Film
film = do
    -- alternatively `title <- stringLit <* newline` with Control.Applicative
    title <- stringLit
    newline
    director <- stringLit
    newline
    year <- intLit
    newline
    userRatings <- stringIntTuple
    newline
    return (title, director, year, [userRatings])

films :: Parsec String u [Film]
films = film `sepBy` newline
gt; many1 digit` with Control.Applicative stringIntTuple :: Parsec String u (String , Int) stringIntTuple = liftM2 (,) stringLit intLit film :: Parsec String u Film film = do -- alternatively `title <- stringLit <* newline` with Control.Applicative title <- stringLit newline director <- stringLit newline year <- intLit newline userRatings <- stringIntTuple newline return (title, director, year, [userRatings]) films :: Parsec String u [Film] films = film `sepBy` newline

Este é o programa principal (escreva "main" em winghci para iniciar o programa)

-- The Main
main :: IO ()
main = do
    putStr "Enter your Username:  "
    name <- getLine
    filmsDatabase <- loadFile "neo.txt"
    appendFile "neo.txt" (show filmsDatabase)
    putStrLn "Your changes to the database have been successfully saved."

Esta é a função loadFile

loadFile :: FilePath -> IO (Either ParseError [Film])
loadFile filename = do
database <- readFile filename 
return $ parse films "Films" database

o outro nome de arquivo txt é neo e inclui alguns filmes como este

"Blade Runner"
"Ridley Scott"
1982
("Amy",5), ("Bill",8), ("Ian",7), ("Kevin",9), ("Emma",4), ("Sam",7), ("Megan",4)

"The Fly"
"David Cronenberg"
1986
("Megan",4), ("Fred",7), ("Chris",5), ("Ian",0), ("Amy",6)

Basta copiar e colar tudo, incluindo um arquivo txt no mesmo diretório e testá-lo para ver o erro que descrevi.

questionAnswers(2)

yourAnswerToTheQuestion