Как заставить HaXml и DrIFT работать с GHC 7.0.3? - PullRequest
3 голосов
/ 21 сентября 2011

Я ищу решение для обмена данными между Haskell и кодом Java / Scala / C #.В настоящее время я думаю об использовании XML.В идеале я хотел бы, чтобы схема XML генерировалась из моих типов данных Haskell.Моей первой попыткой был HaXml 1.22.2, DrIFT 2.2.2.Все на 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

из этого файла 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
    { e@(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 v@A =
    [mkElemC (showConstr 0 (toHType v)) []]
    toContents v@(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

Это проблема с инструментами или я делаю что-то не так?Как решить эту проблему?

Ответы [ 3 ]

2 голосов
/ 21 сентября 2011

Изучение документации Hackage для более старых версий HaXml показывает, что в версии 1.20.2 и более ранних версиях конструктор данных Elem использовал Name, который является просто синонимом типа для String. Однако когда-то между этим и версией 1.22.3 он был изменен на QName, то есть пользовательский тип данных .

Поэтому имеет смысл, что использование isPrefixOf в именах элементов будет допустимо для более старых версий, но недопустимо для более новых версий.

По датам загрузки этих версий это произошло где-то в прошлом году, хотя DrIFT, по-видимому, не обновлялся с 2009 года.

Вы, вероятно, должны сообщить об этом сопровождающему DrIFT. В то же время вы можете обойти это, используя более старую версию HaXml или написав экземпляры самостоятельно. Вы должны быть в состоянии использовать неправильно сгенерированные экземпляры в качестве отправной точки.

0 голосов
/ 22 сентября 2011

Непроверенное исправление:

1) Измените строку с надписью import Data.List (isPrefixOf) на

import qualified Data.List(isPrefixOf) as List

2) Добавьте этот код:

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

Я не уверен, дает ли это предполагаемое поведение для квалифицированных имен.

0 голосов
/ 22 сентября 2011

Недавно я успешно интегрировал Haskell и Python, используя проект Apache Thrift . Компилятор Thrift работает с файлом определения данных и сервисов, чтобы сгенерировать код в необходимых языках для создания клиента и серверов, которые беспрепятственно передают сообщения друг другу.

...