Haskell 的 Text.JSON 库使用一种称为 Result 的抽象数据类型,它基本上是它们的 Maybe 形式,但不是 Nothing,而是 Error String。Anywho,我需要使用 liftIO 将返回 IO 事物的函数调用转换为 JSON.readJSON 实现中的 Result 事物。我是 monad 转换器的新手,似乎无法为 Result 实现 liftIO(根据 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
}
因此,return 之前的最后一行使用 getSiteTitle 来解析位于该 url 的网站以获取其标题。但是,该函数返回一种 IO String 类型,编译器告诉我它希望它是 Result。这是不可能的吗?
再次感谢!
编辑2
我决定从我的数据类型中删除标题,稍后在 IO monad 中获取它。感谢大家的帮助!我当然从这个问题中学到了东西。