Вот что вызвало другую ошибку, которую вы назвали менее важной:
use :: [String] -> IO ()
use args =
do
init <- last args
Оператор <-
используется в блоке do
для извлечения чего-либо, содержащегося в монаде (в данном случае IO
), чтобы вы могли работать с фактическим значением, захваченным внутри. Но args
здесь имеет тип [String]
, а не IO [String]
, поэтому вам не нужно этого делать; вы уже вытащили список аргументов из IO
с arg <- getArgs
в main.
Если вы хотите присвоить немонадное значение временной переменной внутри блока do
, используйте вместо нее let
, например:
let x = last args
Похоже, вы делаете ту же ошибку и в нескольких других местах, а не только в этой строке. Необходимость по-разному относиться к монадическим и немонадным значениям, когда вы просто хотите создать временную переменную внутри своей функции, легко запутать кого-то, кто плохо знаком с языком.
Кстати, init
- это имя функции в стандартной библиотеке, поэтому вы можете использовать другое имя переменной.