Во-первых, вы должны признать, что parseFile
должен работать в монаде IO, поскольку он связан с файловыми вводами/выводами. Это означает извлечение содержимого из действия IO, созданного readFile
, после чего упаковка результатов возвращается в действие IO. Здесь первый в два этапа, отделяя чистое вычисление от действий ввода-вывода:
parseContents :: String -> [SpecificDataStructure]
parseContents contents = map parseMessage (lines contents)
parseFile :: String -> IO [SpecificDataStructure]
parseFile fileName = readFile fileName >>= return . parseContents
и здесь написано, как одна функция
parseFile :: String -> IO [SpecificDataStructure]
parseFile fileName = do
contents <- readFile fileName
let parsed = map parseMessage (lines contents)
return parsed