Добавить к тому, что MatrixFrog упомянул в своем ответе. Если вы посмотрите на сигнатуру вашей функции, т.е. [String] -> Int -> [String]
, это означает, что эта функция является чистой функцией и не имеет побочных эффектов, где, как и в вашем теле функции, вы используете doesFileExist
, который имеет сигнатуру String -> IO Bool
, где Наличие IO указывает на то, что это нечистая функция, то есть включает в себя некоторое IO. В haskell существует строгое разделение между нечистыми и чистыми функциями, и на самом деле, если ваша функция вызывает какую-то другую функцию, которая нечиста, чем ваша функция, она также нечиста. Так что в вашем случае ваша функция checkString
должна быть нечистой, и это можно сделать, вернув ей значение IO [String]
, о чем MatrixFrog упомянул в своем ответе.
С другой стороны, я бы посоветовал вам сделать функцию примерно такой:
checkString :: String -> IO (Maybe String)
, поскольку вашей функции не нужен весь список строк, поскольку ей просто нужна определенная строка из списка, чтобы выполнить свою работу, и вместо того, чтобы выдавать ошибку, вы можете использовать Maybe, чтобы обнаружить ошибку.
Это всего лишь предложение, но оно также зависит от того, как используется ваша функция.