Я новичок в Haskell и пытаюсь понять, как работает IO.У меня есть структура данных, дерево, которое я хочу сериализовать в файл, а затем десериализовать обратно в структуру данных.Кажется, что я должен быть в состоянии сделать это с помощью шоу и чтения, но мое использование чтения вызывает ошибку.Вот соответствующая часть моего кода:
data Tree = Answer String | Question String Tree Tree deriving (Read, Show)
fileToTree :: (Read a) => FilePath -> IO a
fileToTree filePath = do
dataStruct <- readFile filePath
return (read dataStruct)
treeToFile :: (Show a) => a -> FilePath -> IO ()
treeToFile dataStruct filePath = do
writeFile filePath (show dataStruct)
main = do
let filePath = "data.txt"
let ds = fileToTree filePath
ask ds
treeToFile ds filePath
ask :: Tree -> IO ()
ask (Question q yes no) = do
putStrLn q
answer <- getLine
Ошибка, которую я получаю: «Не удалось сопоставить ожидаемый тип« Дерево »с предполагаемым типом« IO a »в первом аргументе« спросить »»,Кажется, что чтение должно возвращать тип дерева, но оно возвращает тип ввода-вывода.Есть ли способ привести его к типу Tree, или я полностью неправильно понял проблему?