File 如果在读取之前它不存在,haskell会将其写入文件

File 如果在读取之前它不存在,haskell会将其写入文件,file,haskell,io,File,Haskell,Io,我正在学习haskell,无意中发现了输入内容上的解析错误'编译错误 我想做的是: 我将以前的会话状态存储在一个文件中。我在启动程序之前阅读了这个文件。但是,在程序的第一次运行期间,文件可能不存在。在这种情况下,我希望首先使用默认值创建文件,然后继续 main :: IO() main = do -- Take input let fileName = "ashish-temp.txt" let dummyBoard = take 5 $ repeat "-----"

我正在学习haskell,无意中发现了输入内容上的
解析错误'
编译错误

我想做的是:

我将以前的会话状态存储在一个文件中。我在启动程序之前阅读了这个文件。但是,在程序的第一次运行期间,文件可能不存在。在这种情况下,我希望首先使用默认值创建文件,然后继续

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"
main::IO()
main=do
--听取意见
让fileName=“ashish temp.txt”
让dummyBoard=取5美元重复“-”

fileExist您的代码库存在一些问题:

  • 您缺少
    if
    表达式的
    else
    部分。在Haskell中,由于
    if
    是一个表达式,因此它需要
    else
    部分,而其他语言中的
    if-else
    是语句,而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"
main::IO()
main=do
让fileName=“somefile.txt”

fileExist问题的第二部分尚未回答

此外,我认为与其将
dummyBoard
写入文件,不如使用
dummyBoard
初始化内容。但我也没能做到。我想这两种方法应该是一样的

事实上,你可以这样做:

contents <- if fileExist
    then readFile fileName
    else return $ unlines dummyBoard

内容您的
其他内容在哪里
?您可能想在
时使用
而不是
如果
我认为
否则
是不必要的。当使用时,我也无法在
上找到任何文档。
else
在Haskell中是强制性的(否则,
10+(如果3==4,那么2)
是什么?)。对于
时,您需要
导入控制。Monad
如果False==…
为什么要编写
?“这似乎很不自然。”BartekBanachewicz我编辑了这个问题。实际上,“我将以前的会话状态存储在一个文件中。我在启动程序之前读取了此文件。但是,在第一次运行程序期间,文件可能不存在。在这种情况下,我希望首先使用默认值创建文件,然后继续。”我将删除
dim
,这是一个重构问题。我想在写入文件后执行
do stuff
部分。我没有任何
逻辑。在这种情况下,我可以用
dummyBoard
内容缩进斜体吗?怎么做?@AshishNegi在这种情况下,您可以在else部分给出
return()
。之后,请阅读文件并将您的逻辑放在那里。很抱歉,我的意思是,我使用该文件只是为了初始化数据。我必须总是做那些事。无论是使用文件中的
数据,还是使用
dummyBoard
@AshishNegi,我认为您可能会混淆
返回()
。Haskell
return
与其他语言的
return
具有不同的含义<代码>返回
不是程序的控制-退出路径。当您将逻辑置于
if-else
之后时,它将被执行,即使它转到
if
表达式的
else
部分。