如何修复在文件中写入列表内容

时间:2019-01-21 10:47:18

标签: haskell

我有一个包含列表的函数。我只想在用户输入后从主文件中将列表内容写入文件中。

putTodo :: (Int, String) -> IO ()
putTodo (n, todo) = putStrLn (show n ++ ": " ++ todo)

prompt :: [String] -> IO ()
prompt todos = do
    putStrLn "The list contains:"
    mapM_ putTodo (zip [0..] todos)
    putStrLn " "
    command <- getLine
    getCommand command todos

我尝试过的事情:

main = do
          outh <- openFile "agenda.txt" WriteMode;
          hPutStrLn outh prompt[]

          -- hPutStrLn outh (show prompt[])
          -- hPrint (show prompt[])
          hClose outh;

谢谢。

1 个答案:

答案 0 :(得分:4)

您的代码包含几个错误/问题:

  • prompt[]无效(在main中)-应该是prompt
  • hPutStrLn期望以String作为第二个参数,但是您提供了IO()
  • getCommand未定义

您需要的是:

  • 待办事项列表(可能由函数返回)
  • 将待办事项列表转换为字符串的函数
  • hPutStrLn将此字符串打印到输出文件

这是一个简单的版本,带有待办事项的硬编码列表(我的Haskell不太先进,因此可以用一种更为优雅的方式完成):

import System.IO

type Todo = (Int, String)

todoToString :: Todo -> String
todoToString (idx, name) = (show idx) ++ " : " ++ name

todosToString :: [Todo] -> String
todosToString todos = foldl (\acc t -> acc ++ "\n" ++ (todoToString t)) "" todos 

allTodos :: [Todo]
allTodos = [(1, "Buy milk"), (2, "Program Haskell")]

main = do
  outh <- openFile "agenda.txt" WriteMode;
  hPutStrLn outh (todosToString allTodos);
  hClose outh;