Haskell читает строки файла

Я хочу прочитать целый файл в строке, а затем использовать функцию lines, чтобы получить строки строки. Я пытаюсь сделать это с помощью этих строк кода:

main = do
   args <- getArgs
   content <- readFile (args !! 0)
   linesOfFiles <- lines content

Но я получаю следующую ошибку при компиляции объявления:

Couldn't match expected type `IO t0' with actual type `[String]'
In the return type of a call of `lines'
In a stmt of a 'do' block: linesOfFiles <- lines content

Я думал, связав результат readFile с контентом, это будет String DataType, почему это не так?

Ответ 1

Я думал, связав результат readFile с контентом, это будет String DataType, почему это не так?

В действительности String не то, о чем компилятор жалуется. Посмотрите на код:

main = do
   args <- getArgs
   content <- readFile (args !! 0)

Теперь content является, по желанию, простой String. И тогда lines content есть [String]. Но вы используете монадическое связывание в следующей строке

   linesOfFiles <- lines content

в блоке do IO (). Поэтому компилятор ожидает выражения типа IO something в правой части <-, но находит [String].

Так как вычисление lines content не содержит никаких IO, вы должны связать его результат с привязкой let вместо монадического связывания,

   let linesOfFiles = lines content

- это строка, в которой вы нуждаетесь.