Haskell 如何修复在文件中写入列表内容的问题

Haskell 如何修复在文件中写入列表内容的问题,haskell,Haskell,我有一个包含列表的函数。我只想在用户输入后从main将列表内容写入文件中 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)

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

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
putTodo::(Int,String)->IO()
putTodo(n,todo)=putStrLn(show n++“:“++todo)
提示::[String]->IO()
提示todos=do
putStrLn“该列表包含:”
mapM_uPuttodo(zip[0..]todos)
putStrLn“”

命令您的代码包含两个错误/问题:

  • prompt[]
    无效(在
    main
    中)-这应该是
    prompt
  • hPutStrLn
    需要一个
    String
    作为其第二个参数,但您提供了
    IO()
  • 未定义
    getCommand
您需要的是:

  • TODO列表(可能由函数返回)
  • 将此TODO列表转换为字符串的函数
  • hPutStrLn
    将此字符串打印到输出文件
下面是一个简单的版本,其中包含一个硬编码的待办事项列表(我的Haskell不是很高级,所以可能可以用更优雅的方式完成):

import System.IO
类型Todo=(Int,String)
todoToString::Todo->String
todoToString(idx,名称)=(显示idx)++”:“++名称
Todo字符串::[Todo]->字符串
todosToString todos=foldl(\acc t->acc++“\n”++(TODOTOTOSTRING t))“”todos
所有待办事项::[待办事项]
allTodos=[(1,“购买牛奶”),(2,“计划Haskell”)]
main=do
当然,你应该在你的问题中包括你遇到的错误——它们通常非常有用。
main = do
          outh <- openFile "agenda.txt" WriteMode;
          hPutStrLn outh prompt[]

          -- hPutStrLn outh (show prompt[])
          -- hPrint (show prompt[])
          hClose outh;
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;