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,您的代码会简单得多。首先您必须了解,然后再了解。