Работаем с некорректным вводом

Можно было бы дописать эту программу, улучшив сообщения об ошибках, возникающих при некорректных исходных данных. Начать можно с добавления варианта функции dispatch, который срабатывает при любой несуществующей команде:

dispatch :: String -> [String] -> IO ()

dispatch "add" = add

dispatch "view" = view

dispatch "remove" = remove

dispatch command = doesntExist command

doesntExist :: String -> [String] -> IO ()

doesntExist command _ =

   putStrLn $ "Команда " ++ command ++ " не определена"

Также можно добавить варианты определения функций add, view и remove для случаев, когда программе передано неправильное количество аргументов. Например:

add :: [String] -> IO ()

add [fileName, todoItem] = appendFile fileName (todoItem ++ " ")

add _ = putStrLn "Команда add принимает в точности два аргумента"

Если функция add будет применена к списку, содержащему не два элемента, первый образец не сработает, поэтому пользователю будет выведено сообщение об ошибке. Аналогично дописываются функции view и remove.

Заметьте, что мы не обрабатываем все возможные случаи некорректного ввода. К примеру, программа «упадёт», если мы запустим её так:

./todo

Мы также не проверяем, существует ли файл, с которым идёт работа. Добавить обработку всех этих событий несложно, хотя и несколько утомительно, поэтому оставляем реализацию «защиты от дурака» в качестве упражнения для читателя.