2

我在网上看到的 Haskell 的 xml-conduit 模块的每个示例都使用了 OverloadedStrings GHC 扩展(例如这里)。我认为这是因为该Text.XML.Cursor.element函数具有 type Name -> Axis。例如,如果没有 OverloadedStrings,此代码段将无法工作:

{-# LANGUAGE OverloadedStrings #-}
import Text.XML
import Text.XML.Cursor
import Data.Text (Text)
import Data.Text.Read (decimal)
import Data.Monoid (mconcat)

main :: IO ()
main = do
    doc <- Text.XML.readFile def "people2.xml"
    let cursor = fromDocument doc
    print $ cursor $// element "{http://example.com}person" >=> parsePerson

data Person = Person Int Text
        deriving Show

parsePerson :: Cursor -> [Person]
parsePerson c = do
    let name = c $/ element "{http://example.com}firstname" &/ content
        ageText = c $/ element "{http://example.com}age" &/ content
    case decimal $ mconcat ageText of
        Right (age, "") -> [Person age $ mconcat name]
        _ -> []

但是,我想编写一个更便携的模块,即不使用这个扩展。这样做的最佳方法是什么?我是否注定Text要从每个字符串中创建一个值Data.Text.pack,然后Text.XML.Name在将结果传递给之前使用数据构造函数element?或者有没有更简单的方法?

4

1 回答 1

4

恐怕“更简单的方法”是-XOverloadedStrings。我还担心您在依赖 xml-conduit 时无法满足您的可移植性目标,因为它本身就自由地使用了语言扩展。

除非您有一个特定的替代编译器,否则您最好使用 -XOverloadedStrings,尤其是因为 xml-conduit 被明确设计为支持它。

于 2014-06-28T02:30:57.760 回答