我在阅读文件并将其加载到电影类型列表中时遇到问题:
testDatabase :: [Film]
testDatabase = [(Film "Ridely Scott" "Test" 2012 [("Zoe",2),("Test",1)]),(Film "Test1" "Test1" 2012 [("Test",4),("Test",5)])]
loadFromFile :: IO ()
loadFromFile = do
putStrLn "Enter the input filename: "
name <- getLine
contents <- readFile name
let testDatabase = length contents `seq` (read contents :: [Film])
putStrLn formatDatabase
putStrLn "Done"
Haskell使用以下方法保存了文本文件:
saveToFile :: IO ()
saveToFile = do
putStrLn "Enter the output filename: "
name <- getLine
writeFile name (show testDatabase)
putStrLn "Done"
它的格式正确,显示大约30个条目,但是当调用load方法时,我在运行时获取testDatabase中的数据。
答案 0 :(得分:2)
看起来你是来自命令式编程背景,而且是函数式编程的新手。需要注意的是:无法更改变量的值。如初。
在这里,您只需在loadFromFile
函数的本地范围内创建一个新的“变量”:
let testDatabase = length contents `seq` (read contents :: [Film])
formatDatabase
完全不知道哪个必须看起来像这样:
formatDatabase :: String
formatDatabase = ... something with the global testDatabase ...
你应该做的是让formatDatabase
成为一个真正的函数(而不是常量String
),并将数据库作为参数:
formatDatabase :: [Film] -> String
formatDatabase database = ... something with database ...
然后打印出来:
let testDatabase = length contents `seq` (read contents :: [Film])
putStrLn (formatDatabase testDatabase)