1

ファイルからの読み取りと、フィルム タイプのリストへのロードに問題があります。

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 にあったデータが取得されます。

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 に答える