如果在读取之前它不存在,则haskell写入文件

时间:2015-02-26 13:02:57

标签: file haskell io

我正在学习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 SS.redFile来阅读文件。

2 个答案:

答案 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