2013-01-24 3 views
1

다음과 같이 혼합 내용 노드 (본문 텍스트와 자식 노드가 모두 있음)를 사용하여 XML을 생성하려고합니다.xmlgen : Haskell에서 혼합 내용 XML 노드 생성 (본문 텍스트와 중첩 된 XML 요소 모두 사용)

<person> 
some text 
<hugo age="24">thingy</hugo> 
</person> 

나는 xmlgen 라이브러리를 사용 중입니다. 여기

내가 가지고 얼마나 멀리입니다 :

import Text.XML.Generator 
import qualified Data.ByteString as B 

makeElt = xelem "person" $ 
      xelems $ (xtext "some text" : 
         (xelem "hugo" (xattr "age" "24" <#> 
            xtext "thingy"))) 

main = do 
    let elt = makeElt 
    B.putStr . xrender $ doc defaultDocInfo elt 

이 컴파일되지 않고 GHC의 오류 메시지 (초보자로) 나에게 이해할 수 :

$ runhaskell test.hs 

test.hs:6:24: 
    Couldn't match type `Elem' with `Xml Elem' 
    The function `xelem' is applied to two arguments, 
    but its type `[Char] 
        -> Text.XML.Generator.MkElemRes [Char] (Xml Attr, Xml Elem)' 
    has only one 
    In the second argument of `(:)', namely 
     `(xelem "hugo" (xattr "age" "24" <#> xtext "thingy"))' 
    In the second argument of `($)', namely 
     `(xtext "some text" 
     : (xelem "hugo" (xattr "age" "24" <#> xtext "thingy")))' 

test.hs:6:24: 
    Couldn't match type `Xml' with `[]' 
    The function `xelem' is applied to two arguments, 
    but its type `[Char] 
        -> Text.XML.Generator.MkElemRes [Char] (Xml Attr, Xml Elem)' 
    has only one 
    In the second argument of `(:)', namely 
     `(xelem "hugo" (xattr "age" "24" <#> xtext "thingy"))' 
    In the second argument of `($)', namely 
     `(xtext "some text" 
     : (xelem "hugo" (xattr "age" "24" <#> xtext "thingy")))' 

이 결과에 나는 매우 가까운임을 나는 이것을 필요로 하는가, 아니면 내가 이것을 다르게 쓰어야 하는가?

xmlgen 라이브러리의 사용 예를 찾으려고했지만 사용 사례를 찾지 못했습니다. 어떤 도움이라도 대단히 감사합니다.

답변

1

문제 (xelem "hugo"으로 시작)을 : 후 발현

(xtext "some text" : 
(xelem "hugo" (xattr "age" "24" <#> 
       xtext "thingy"))) 

부분에 목록이 아니다. 이러한 유형 문제를 디버깅하는 좋은 방법은 ghci를 사용하는 것입니다. 그게 내가 처음에 무슨 짓을했는지, 그리고 ghci 신속하게 올바른 방향을 안내 : GHC는의를 처음부터 나쁜 오류 메시지를 줄 이유

*Text.XML.Generator> :t xtext "some text" : xelem "hugo" (xattr "age" "24" <#> xtext "thingy") 

<interactive>:1:21: 
    Couldn't match expected type `[Xml Elem]' 
       with actual type `Xml Elem' 
    In the return type of a call of `xelem' 
    In the second argument of `(:)', namely 
     `xelem "hugo" (xattr "age" "24" <#> xtext "thingy")' 
    In the expression: 
     xtext "some text" 
     : xelem "hugo" (xattr "age" "24" <#> xtext "thingy") 

좋은 질문입니다. 문제는 xelem의 결과 유형이 오버로드되어 실제로 xelem 유형이 n -> MkElemRes n c 인 것입니다. 귀하의 예제에서 사용하려는 MkElemRes n c의 인스턴스화는 실제로 함수 유형이므로 예제의이 부분은 정확합니다. 그러나 일반적으로 MkElemRes n c은 함수 유형일 필요가 없으므로 GHC는 하나만 예상되는 두 개의 인수 (즉, MkElemRes n c 유형 중 하나)에 대해 불만을 표시합니다.

xelem "person" $ xtext "some text" <> xelem "hugo" (xattr "age" "24" <#> xtext "thingy") 
: 여기
xelem "person" $ 
    xelems [xtext "some text", xelem "hugo" (xattr "age" "24" <#> xtext "thingy")] 

대안 솔루션입니다 : 여기

은 원래 문제에 대한 하나 개의 솔루션입니다