Получите пользовательский ввод и добавьте его в список

#haskell

Вопрос:

Функция buildTasksList принимает и пустой список получает ввод пользователя и возвращает новый список с добавленным в него вводом пользователя.

В основной функции я пытаюсь создать новый список, выполнив task buildTasksList [] этот подход, выдайте мне эту ошибку

Не удалось сопоставить тип «[] » с » IO » Ожидаемый тип: IO a0 Фактический тип: [a0]

 task = []

printTasks [] = do
  putStrLn "That's all the tasks!"
printTasks (x : xs) = do
  putStrLn $ "  "    x
  printTasks xs

buildTasksList tasks = do
  putStrLn "Enter a task: "
  input <- getLine
  let task = input : tasks
  return task


main = do
  putStrLn "Below are the options: naddnprintnsearch"
  input <- getLine
  task    buildTasksList []
  main
 

Ответ №1:

проблема в том, что ваша функция buildTasksList имеет тип:

 buildTasksList :: [String] -> IO [String]
 

в то время как задача имеет тип:

 [a]
 

таким образом, вам нужно будет извлечь результат списка задач построения из его контекста:

 l_Tasks <- buildTasksList []
let newTasks = l_Tasks    task
return newTasks
 

Упростив свой пример и добавив опцию завершения, вы могли бы сделать что-то вроде:

 main :: IO ()
main = main' []
    where
        main' :: [String] -> IO ()
        main' list = do
            putStrLn "Below are the options: naddnprintnsearch"
            putStrLn "Enter a task: "
            input <- getLine 
            correctInput input list

        correctInput :: String -> [String] -> IO ()
        correctInput input list
            | input == "add" || input == "print" || input == "search" 
                = main' $ input : list
            | input == "End" = printTasks list
            | otherwise = do
                putStrLn "wrong input"
                main' list