У меня есть входные данные, предназначенные для моих еще не написанных приложений Haskell, которые находятся в файле. Я не обновляю файл. Мне просто нужно прочитать файл и передать его в мою функцию Haskell, которая ожидает список строк. Но чтение файла, конечно, дает IO
объектов данных. Я узнал, что с помощью операции <-
можно каким-то образом "извлечь" строки, упакованные в структуру IO
, поэтому я попробовал эту попытку:
run :: [String]
run = do
datadef_content <- readFile "play.txt" -- yields a String
let datadef = lines datadef_content -- should be a [String]
return datadef
Я поместил это в файл play.hs
и загрузил его из ghci с помощью
:l play
К моему удивлению, я получил сообщение об ошибке для строки readFile
Couldn't match type ‘IO’ with ‘[]’ Expected type: [String] Actual type: IO String
а для return
сообщение об ошибке
Couldn't match type ‘[Char]’ with ‘Char’ Expected type: [String] Actual type: [[String]]
Первое, кажется, указывает на то, что я не могу избавиться от IO
, а последнее сообщение, похоже, предполагает, что lines
вернет список списка строк, что также не имеет для меня смысла.
Как мне это сделать правильно?
IO
(или, по крайней мере, вы не должны стараться никогда этого не делать). ЕстьunsafeIO
, но обычно это создает больше проблем, чем решает. - person Willem Van Onsem   schedule 02.02.2020Do
-нотация объяснена яркими цветами. - person Will Ness   schedule 02.02.2020run :: [String]
. Вместо этого возьмите функциюfoo :: [String] -> blah
, которая принимает содержимоеrun
в качестве аргумента, и преобразуйте ее вwrappedFoo :: IO [String] -> blah
, используя соответственноfmap
или(=<<)
, а затем примените ее кrun :: IO [String]
. - person Daniel Wagner   schedule 03.02.2020run :: [String]
равносильно обещанию того, чтоrun
не выполняет операций ввода-вывода и является чистым постоянным списком строк. Если вы хотите выполнить ввод-вывод, вам необходимо объявитьrun :: IO [String]
, сообщив компилятору, что это зависит от ввода-вывода и что он может выполняться несколько раз, возможно, с разными результатами (если, например,"play.txt"
изменяет свое содержимое). - person chi   schedule 03.02.2020