我正在尝试学习使用xmlgen库,但是当我尝试http://factisresearch.blogspot.in/2011/05/xmlgen-feature-rich-and-high.html中的示例时,我收到了编译错误。
以下是代码:
import Text.XML.Generator
import Data.ByteString.Lazy as BSL
import Prelude as P
genXml' :: Xml Doc
genXml' =
let people = [("Stefan", "32"), ("Judith", "4")]
in doc defaultDocInfo $
xelem "people" $
xelems $ P.map (\(name, age) -> xelem "person" (xattr "age" age <#> xtext name)) people
outputXml :: IO ()
outputXml = BSL.putStr (xrender genXml')
编译器错误:
$ ghc --make prog.hs
[1 of 1] Compiling Main ( prog.hs, prog.o )
prog.hs:13:25:
No instance for (XmlOutput ByteString)
arising from a use of `xrender'
Possible fix:
add an instance declaration for (XmlOutput ByteString)
In the first argument of `BSL.putStr', namely `(xrender genXml')'
In the expression: BSL.putStr (xrender genXml')
In an equation for `outputXml':
outputXml = BSL.putStr (xrender genXml')
编译器似乎在推断“xrender genXML”需要是“XmlOutput ByteString”类型,并且在xmlgen库中有一个这样的实例。所以请帮助我理解这个错误的含义,以及如何解决它。
如果有帮助,我在Ubuntu 12.10中使用Haskell平台,ghc 7.4.2和xmlgen 0.4.0.3
答案 0 :(得分:3)
编译器似乎在推断“xrender genXML”需要是“XmlOutput ByteString”类型
不,编译器推断(使用BSL.putStr
)xrender genXML'
需要Data.ByteString.Lazy.ByteString
类型。
由于xrender
的类型是
xrender :: (Renderable r, XmlOutput t) => Xml r -> t
能够使用t
实例化Data.ByteString.Lazy.ByteString
的必要条件是懒惰XmlOutput
的{{1}}个实例。
由于存在从ByteString
导出的此类实例,因此我看到的错误消息的唯一原因是您的
Text.XML.Generator
从bytestring
包的不同版本导入模块,而不是构建import Data.ByteString.Lazy as BSL
库。
您可以使用xmlgen
检查,其中列出了依赖关系中构建的ghc-pkg describe xmlgen
版本,并bytestring
检查已安装的ghc-pkg list bytestring
版本?