没有重载字符串的Haskell xml管道?
我在网上看到的Haskell的xml导管模块的每个示例都使用重载字符串GHC扩展,例如。我假设这是因为Text.XML.Cursor.element函数的类型为Name->Axis。例如,如果没有重载字符串,此代码段将无法工作:没有重载字符串的Haskell xml管道?,xml,haskell,xml-conduit,Xml,Haskell,Xml Conduit,我在网上看到的Haskell的xml导管模块的每个示例都使用重载字符串GHC扩展,例如。我假设这是因为Text.XML.Cursor.element函数的类型为Name->Axis。例如,如果没有重载字符串,此代码段将无法工作: {-# LANGUAGE OverloadedStrings #-} import Text.XML import Text.XML.Cursor import Data.Text (Text) import Data.Text.Read (decimal) impor
{-# 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]
_ -> []
但是,我想编写一个更可移植的模块,即不使用此扩展。这样做的最佳方式是什么?在将结果传递给元素之前,我是否注定要使用Data.Text.pack从每个字符串创建一个文本值,然后使用Text.XML.Name数据构造函数?或者有更简单的方法吗?恐怕更简单的方法是-XOverloadedStrings。我还担心,在依赖xml管道的情况下,您将无法实现可移植性目标,因为它自由地使用了语言扩展本身
除非您有一个特定的替代编译器,否则最好使用-xOverloadedString,特别是因为xml管道是显式设计来支持它的。恐怕更简单的方法是-xOverloadedString。我还担心,在依赖xml管道的情况下,您将无法实现可移植性目标,因为它自由地使用了语言扩展本身
除非您有一个特定的替代编译器,否则您最好使用-XoverLoadedString,特别是因为xml管道是显式设计来支持它的。让人欣慰的是,OverloadedStrings显然是正确的扩展之一,并且应该从语言标准开始。让人欣慰的是,OverloadedStrings显然是正确的扩展之一而且应该从语言标准开始。