0

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')

コンパイラは、「xrendergenXML」は「XmlOutputByteString」タイプである必要があると推測しているようで、xmlgenライブラリにこのインスタンスがあります。したがって、このエラーの意味と修正方法を理解するのを手伝ってください。

それが役立つ場合は、Ubuntu 12.10、ghc 7.4.2、およびxmlgen0.4.0.3のHaskellプラットフォームを使用しています

4

1 に答える 1

3

コンパイラは、「xrendergenXML」は「XmlOutputByteString」タイプである必要があると推測しているようです。

いいえ、コンパイラは(の使用からBSL.putStrxrender genXML'タイプである必要があると推測しますData.ByteString.Lazy.ByteString

のタイプxrender

xrender :: (Renderable r, XmlOutput t) => Xml r -> t

tインスタンス化できるようにするために必要な条件Data.ByteString.Lazy.ByteStringは、XmlOutput怠惰なByteStringsのインスタンスです。

からエクスポートされたそのようなインスタンスがあるのでText.XML.Generator、私が見るエラーメッセージの唯一の原因はあなたの

import Data.ByteString.Lazy as BSL

ライブラリが構築されたのとは異なるバージョンのbytestringパッケージからモジュールをインポートします。xmlgen

依存関係の中でビルドされghc-pkg describe xmlgenたバージョンを一覧表示するでそれを確認し、インストールしたバージョンを確認できますか?bytestringghc-pkg list bytestringbytestring

于 2012-11-17T14:01:09.817 に答える