Библиотека Haskell Text.JSON использует абстрактный тип данных с именем Result, в основном это их форма Maybe, но вместо Nothing есть строка ошибки. Как бы то ни было, мне нужно использовать liftIO для преобразования вызова функции, возвращающей IO, в Result внутри моей реализации JSON.readJSON. Я новичок в монадных преобразователях и, похоже, не могу реализовать liftIO для Result (я продолжаю пытаться создать бесконечный тип, согласно ghci).
Есть идеи?
Большое спасибо
EDIT
Извините, что у меня ушло так много времени на разработку! Я ценю вашу помощь, ребята.
readJSON (JSObject obj) = do text <- getVal obj "text"
user <- getVal obj "from_user"
iden <- getVal obj "id_str"
url <- (do if (length.extractURLs) text == 0
then return ""
else return $ head $ extractURLs text)
title <- liftIO (getSiteTitle url)
return $
Tweet
NewsStory {
title = "Twitter",
desc = text,
url = url,
metric = 0,
sourceURL = "twitter.com/" ++ user ++ "/status/" ++ iden
}
Таким образом, последняя строка перед возвратом использует getSiteTitle для анализа веб-сайта по этому URL на предмет его заголовка. Тем не менее, эта функция возвращает тип IO String, и компилятор говорит мне, что хочет, чтобы она была Result. Это невозможно?
Еще раз спасибо!
EDIT2
Я решил исключить заголовок из моего типа данных и получить его позже, когда он находится внутри монады ввода-вывода. Спасибо всем за помощь! Я, безусловно, научился этому вопросу.