1

我在读取文件并将其加载到类型 Film 的列表中时遇到问题:

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 个条目,但是当调用加载方法时,我得到了运行时 testDatabase 中的数据。

4

1 回答 1

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)
于 2012-05-01T20:36:03.940 回答