Библиотека Haskell Text.JSON использует абстрактный тип данных под названием Result, в основном это их форма Maybe, но вместо Nothing есть Error String. В любом случае, мне нужно использовать liftIO для преобразования вызова функции, возвращающего объект ввода-вывода, в объект Result внутри моей реализации JSON.readJSON. Я новичок в монадных преобразователях и не могу реализовать liftIO для Result (я все время пытаюсь построить бесконечный тип, согласно ghci).
Любые идеи?
Большое спасибо
ИЗМЕНИТЬ
Извините, что у меня ушло так много времени на уточнение! Я ценю вашу помощь, ребята.
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-адресу на предмет его заголовка. Однако эта функция возвращает тип строки ввода-вывода, и компилятор сообщает мне, что хочет, чтобы она была результатом. Это невозможно?
Спасибо еще раз!
РЕДАКТИРОВАТЬ2
Я решил исключить заголовок из моего типа данных и получить его позже, когда внутри монады ввода-вывода. Спасибо всем за помощь! Я, конечно, извлек урок из этого выпуска.
readJSON
должен возвращать значение типаResult whatever
, которое не связано сIO
. (В любом случае, зачем вам выполнять ввод-вывод для синтаксического анализа JSON?) Но можете ли вы прояснить свой вопрос, например, показав нам код, вызывающий ошибку, и точный текст сообщения об ошибке? - person Reid Barton   schedule 14.11.2010