Haskell ReadFile не работает для существующих файлов

Я пишу функцию на 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))

person yungtrizzle    schedule 09.09.2018    source источник
comment
Вы запускаете его в том же каталоге? Расположение исполняемого файла не имеет значения: он берет pwd и добавляет к нему имя файла.   -  person Willem Van Onsem    schedule 09.09.2018
comment
В дополнение к комментарию Виллема. Если вы работаете в Windows: если в PowerShell pwd предопределен как псевдоним для Get-Location, который возвращает текущее местоположение. На CMD pwd недоступен, для получения текущего каталога запускаем cd (без аргументов).   -  person Mor A.    schedule 09.09.2018
comment
Я на Ubuntu и работаю в том же каталоге. Я даже скопировал в новый каталог, чтобы проверить наличие разрешений.   -  person yungtrizzle    schedule 09.09.2018


Ответы (1)


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

import fact.fn

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

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

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

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

person K. A. Buhr    schedule 09.09.2018
comment
Большое спасибо!! Чувствуется, что это полная нубская работа, которую я пропустил. - person yungtrizzle; 10.09.2018