2011-09-21 2 views
3

하스켈과 Java/Scala/C# 코드 간의 데이터 교환 솔루션을 찾고 있습니다. 현재 XML 사용에 대해 생각하고 있습니다. 이상적으로는 Haskell 데이터 유형에서 XML 스키마를 생성하고 싶습니다. 첫 번째 시도는 HaXml 1.22.2, DrIFT 2.2.2였습니다. GHC 7.0.3의 모든 것.HaXml 및 DrIFT를 GHC 7.0.3에서 작동시키는 방법은 무엇입니까?

import Data.List (isPrefixOf) 
import Text.XML.HaXml.XmlContent 
import Text.XML.HaXml.Types 
import Text.XML.HaXml.Pretty (document) 

data MyType = A | B String deriving (Eq, Show) 
     {-! derive : XmlContent !-} -- this line is for DrIFT 

이 파일에서, 드리프트 생산 :

{- Generated by DrIFT (Automatic class derivations for Haskell) -} 
{-# LINE 1 "ts.hs" #-} 
import Data.List (isPrefixOf) 
import Text.XML.HaXml.XmlContent 
import Text.XML.HaXml.Types 
import Text.XML.HaXml.Pretty (document) 


data MyType = A | B String deriving (Eq, Show) 
     {-! derive : XmlContent !-} -- this line is for DrIFT 
{-* Generated by DrIFT : Look, but Don't Touch. *-} 
instance HTypeable MyType where 
    toHType v = 
    Defined "MyType" [] [Constr "A" [] [],Constr "B" [] [toHType aa]] 
     where 
    (B aa) = v 
instance XmlContent MyType where 
    parseContents = do 
    { [email protected](Elem t _ _) <- elementWith (flip isPrefixOf) ["B","A"] 
    ; case t of 
     _ | "B" `isPrefixOf` t -> interior e $ fmap B parseContents 
     | "A" `isPrefixOf` t -> interior e $ return A 
    } 
    toContents [email protected] = 
    [mkElemC (showConstr 0 (toHType v)) []] 
    toContents [email protected](B aa) = 
    [mkElemC (showConstr 1 (toHType v)) (toContents aa)] 

-- Imported from other files :- 

GHC이 코드를 컴파일 오류 메시지가 생성됩니다이 문제와

19:32: 
    Couldn't match expected type `[Char]' with actual type `QName' 
    In the second argument of `isPrefixOf', namely `t' 
    In the expression: "B" `isPrefixOf` t 
    In a stmt of a pattern guard for 
       a case alternative: 
      "B" `isPrefixOf` t 

인가는 다음 코드가있다 금형이나 뭔가 잘못하고 있는거야? 이 문제를 해결하는 방법? 주위 HaXml의 이전 버전에 대한 Hackage 설명서

답변

2

보게은 밝혀 해당 버전 1.20.2와의 이전, String 단지 타입 동의어입니다 Elem 데이터 생성자 used to take a Name. 그러나 그 사이의 버전 1.22.3, 그리고 그것은 , 즉 a custom data type 걸릴 변경되었습니다. 따라서 isPrefixOf을 요소 이름에 사용하면 이전 버전에서는 유효하지만 최신 버전에서는 유효하지 않습니다. 당신은 아마이의 드리프트 테이너를 통보해야

2009 년부터 드리프트가 업데이트 된 것으로 나타나지 않는 반면 이러한 버전의 업로드 날짜에서

,이, 지난 한 해 동안 언젠가 일어났다. 그 사이에 HaXml의 이전 버전을 사용하거나 인스턴스를 직접 작성하여이 문제를 해결할 수 있습니다. 잘못된 생성 된 인스턴스를 시작점으로 사용할 수 있어야합니다.

+0

게시 된 코드 조각은 HaXml> = 1.4 –

+0

@ KacperBak : Yep에 대해 의도 된 XmlContent를 사용합니다. 그래도 조사해 보면 1.4 변경 사항이 여기에서 문제가되지 않음을 알 수 있습니다. 이 변화는 훨씬 나중에 일어났습니다. 내 업데이트 답변을 참조하십시오. – hammar

+0

답변 해 주셔서 감사합니다. 지금은 HaXml 1.20.2를 사용하고 모든 것이 예상대로 작동합니다. –

0

저는 최근에 Apache Thrift 프로젝트를 사용하여 하스켈과 파이썬을 통합하는 데 성공했습니다. Thrift 컴파일러는 데이터 및 서비스 정의 파일에서 작동하여 필요한 언어로 코드를 생성하여 메시지를 서로 원활하게 전달하는 클라이언트 및 서버를 만듭니다.

+0

나는 그 해결책을 보았고 또한 protobuf를 들여다 보았다. 문제는 둘 다 내가 사용하는 다른 생성 된 코드와 잘 작동하지 않는 데이터 유형을위한 하스켈 코드를 생성한다는 것이다. 그렇지 않으면, Thrift와 protobuf가 작동합니다. –

0

안된 수정 :

1) 수입 Data.List (isPrefixOf)에

import qualified Data.List(isPrefixOf) as List 

2)이 코드를 추가 말한다 라인 변경 : 경우

isPrefixOf (N n) = List.isPrefixOf n 
isPrefixOf (QN _ n) = List.isPrefixOf n 

임 확실하지를 이것은 정규화 된 이름에 대해 의도 된 동작을 제공합니다.