Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 加载/修改/保存对文本文件的更改_Haskell_Functional Programming - Fatal编程技术网

Haskell 加载/修改/保存对文本文件的更改

Haskell 加载/修改/保存对文本文件的更改,haskell,functional-programming,Haskell,Functional Programming,请允许我先分享我目前所拥有的: main :: IO () main = do contents <- readFile "filmList.txt" let database = (read contents :: [Film]) putStr "Please enter your username: " userName <- getLine menu database where menu newDb

请允许我先分享我目前所拥有的:

main :: IO ()
main = do contents <- readFile "filmList.txt"
      let database = (read contents :: [Film])
      putStr "Please enter your username: "
      userName <- getLine
      menu database        
      where menu newDb = do putStrLn "\nPlease select an option:"
                            putStrLn "1: Display all films currently in the database"
                            putStrLn "2: Add a new film to the database (and display all films)"
                            putStrLn "3: "
                            putStrLn "4: Save Database"
                            putStrLn "5: Exit"
                            putStr "\nSelected option: "
                            option <- getLine
                            case option of "1" -> putStrLn(displayFilms newDb)
                                           "2" -> do putStr "Name of film: "
                                                     title <- getLine
                                                     putStr "Name of director: "
                                                     director <- getLine
                                                     putStr "Year of release: "
                                                     year <- getLine
                                                     putStrLn(displayFilms (addNewFilm title director (read year) newDb))
                            menu newDb
main::IO()

main=do contents请记住Haskell中的所有内容都是不可变的。当您编写
addNewFilm(addNewFilm title director(read year)newDb
时,这不会改变由
newDb
表示的数据库以包含新信息;它只会返回一个包含所有旧信息和新行的新数据库。您有责任选择使用旧数据库的位置和时间(具有讽刺意味的是,命名为
newDb
)或函数返回的新数据库

例如,您可以编写以下
案例

case option of "1" -> putStrLn (displayFilms newDb) >> menu newDb
               "2" -> do ...
                         let evenMoreReallyNewDb = addNewFilm title director (read year) newDb
                         putStrLn (displayFilms evenMoreReallyNewDb)
                         menu evenMoreReallyNewDb
您可能会注意到这两种情况都以非常相似的模式结束(一个是
putStrLn.displayFilms
,然后是
菜单
)。将它们统一起来将是一个好主意;看看您自己是否可以看到如何做到这一点


如果您想将修改后的数据库写回文件,您当然需要使用
writeFile
或类似的函数显式地执行此操作。

谢谢Daniel,我现在已经设法解决了这个问题,并且能够很好地保存到txt文件。不过,我一直在查找您提到的关于统一重复的内容VE代码。你怎么建议我去做这个?我在网上找不到任何有用的东西。也许我需要在正确的地方搜索。你能给我一些建议吗?我真的很感激。谢谢。“KieReNeDaveD考虑定义另一个函数<代码> Munu.打印DB=PutsTrn(DISPACKIDES DB)。>>菜单db
并调用它,而不是在两个分支中重复代码。此外,如果您想在将来编写更多惯用代码,请了解monad transformers。如果您使用
StateT[Film]IO()
monad,您的代码会简单得多。首先您必须了解,然后再了解。