Haskell ReadFile не работает для существующих файлов - PullRequest
0 голосов
/ 09 сентября 2018

Я пишу функцию в Haskell как часть компилятора, чтобы открыть файл, прочитать из него набор имен файлов и объединить их в строку. Код прекрасно работает в ghci, но завершается неудачно при компиляции со следующим:

fact.fn: openFile: не существует (такого файла или каталога нет)

Я полностью уверен, что fact.fn существует и находится в том же каталоге, что и исполняемый файл.

Соответствующий код:

compile [fileName] = do  
             (ilude, contents) <- imports fileName
             let lude = "prelude.fn" : ilude
             prld <- fmap fullPrelude (mapM readFile lude) --seems to fail here, 
--but works fine in the interpreter
             let newPrld = unlines [prld, "\nend"]
             runEvalWith HappyParser.parseExpr fileName contents newPrld


imports :: String -> IO ([String], String)
imports fileName = do 
    contents <- readFile fileName
    let ls = lines contents
    let ifile = filter (isPrefixOf "import") ls {-find import string here-}
    let contentList = filter (\w -> w `notElem` ifile) ls
    let impts = mapMaybe (stripPrefix "import") ifile
    return (impts, (unlines contentList) )


fullPrelude :: [String] -> String
fullPrelude [] = ""
fullPrelude xs = unlines( map (procPrelude) xs)

procPrelude :: String -> String
procPrelude pld = unlines(init(words pld))

1 Ответ

0 голосов
/ 09 сентября 2018

Я считаю, что проблема заключается в том, что при обработке команды импорта, такой как:

import fact.fn

вы не убираете пробел из начала имени файла, поэтому ваша программа пытается импортировать файл " fact.fn", а не "fact.fn". Вы можете убедиться в этом, если внимательно изучите сообщение об ошибке. Если ошибка:

*** Exception:  fact.fn: openFile: does not exist (No such file or directory)

с двумя пробелами вместо одного между Exception: и fact.fn, тогда в начале имени файла есть дополнительный пробел.

Я абсолютно не представляю, как вы смогли успешно запустить его в интерпретаторе.

...