没有OverloadedStrings的Haskell xml-conduit?

时间:2014-06-28 01:28:05

标签: xml haskell xml-conduit

我在网上看到的每个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数据构造函数?或者有一些更简单的方法吗?

1 个答案:

答案 0 :(得分:4)

我害怕&#34;更容易的方式&#34;是-XOverloadedStrings。我还害怕你在依赖xml-conduit时无法满足你的可移植性目标,因为它本身就可以自由使用语言扩展。

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