我正在学习haskell,我偶然发现了parse error on input contents'
编译错误。
我想做什么:
我将以前的会话状态存储在一个文件中。我在启动程序之前读了这个文件。但是,在第一次运行程序期间,文件可能不存在。在这种情况下,我想首先使用默认值创建文件,然后继续。
main :: IO()
main = do
-- Take input
let fileName = "ashish-temp.txt"
let dummyBoard = take 5 $ repeat "-----"
fileExist <- doesFileExist fileName
if False == fileExist
then writeFile fileName $ unlines dummyBoard
-- getting an error on this line
contents <- readFile fileName
-- do processing () :)
-- i want the value in contents
putStrLn "Done"
另外,我认为不是将dummyBoard
写入文件,而是可以使用dummyBoard
初始化内容。但我也做不到。我猜两种方式应该是一样的。
请帮忙。 感谢。
修改解决方案:
haskell中的每个else
都需要 if
。
此问题后您将遇到的另一个问题是:
*** Exception: ashish-temp.txt: openFile: resource busy (file is locked)
使用import qualified System.IO.Strict as S
和S.redFile
来阅读文件。
答案 0 :(得分:5)
您的代码库存在一些问题:
else
表达式的if
部分。在Haskell中,由于if
是一个表达式,它需要else
部分而不是if-else
是语句而其他部分不是必需的其他语言。dim
?你必须定义它。一个工作程序,显示出你想要做的概念类似:
main :: IO()
main = do
let fileName = "somefile.txt"
fileExist <- doesFileExist fileName
if not fileExist
then writeFile fileName "something"
else return ()
contents <- readFile fileName
-- do stuff with contents here
putStrLn "Done"
答案 1 :(得分:1)
你有问题的第二部分尚未得到答复。
另外,我认为不是将
dummyBoard
写入文件,而是可以使用dummyBoard
初始化内容。但我也做不到。我猜两种方式应该是一样的。
确实可以,如下:
contents <- if fileExist
then readFile fileName
else return $ unlines dummyBoard