我在网上看到的每个Haskell xml-conduit模块的例子都使用了OverloadedStrings GHC扩展(例如here)。我假设这是因为Text.XML.Cursor.element
函数的类型为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
数据构造函数?或者有一些更简单的方法吗?
答案 0 :(得分:4)
我害怕&#34;更容易的方式&#34;是-XOverloadedStrings。我还害怕你在依赖xml-conduit时无法满足你的可移植性目标,因为它本身就可以自由使用语言扩展。
除非您有一个特定的替代编译器,否则您也可以使用-XOverloadedStrings,尤其是因为xml-conduit明确设计为支持它。