Haskell рендеринг adt как проблема дизайна XML - PullRequest
0 голосов
/ 02 декабря 2019

Я новичок в Haskell, и я ударил стену во время игрушечного проекта. Я просто пытаюсь смоделировать юнит и контейнер, которые могут использовать юниты и контейнеры в качестве членов. Я хочу сериализовать модуль и контейнер как XML, возможно, другие форматы впоследствии. Вот что у меня пока что

module Model where
import           Data.Map                       ( Map )  -- importing type
import           Data.Text                      ( Text )

data ModelInfo = InfoCons {
                    modelId :: Text, modelType :: Text,
                    modelAttrs :: Map Text Text
                } deriving (Show, Eq)

data UnitModel = UnitCons { unitInfo :: ModelInfo, unitData :: Text} deriving (Show, Eq)

data ContainerModel = ContainerCons {  containerInfo :: ModelInfo
                       , containerData :: [ContainerData]} deriving (Show, Eq)


data ContainerData = NestedCons ContainerModel
                    | SimpleCons UnitModel
                     deriving (Show, Eq)

Это мои модели. Они в основном вдохновлены от здесь . Вот мои функции рендеринга:


class ModelRenderer model where
    -- function definition
    addIdType2Props :: (model -> ModelInfo) -> model -> Map Txt.Text Txt.Text
    addIdType2Props f mdl = add2Map
        (modelAttrs (f mdl))
        [(Txt.pack "id", modelId (f mdl)),
         (Txt.pack "type", modelType (f mdl))]

    makeElement :: model -> Xml.Element


-- transform unit model to xml

instance ModelRenderer UnitModel where
    makeElement um = Xml.Element
        { Xml.elementName       = makeName (Txt.pack "unit")
        , Xml.elementAttributes = convertTxt2NameMap
                                      (addIdType2Props unitInfo um)
        , Xml.elementNodes      = [Xml.NodeContent (unitData um)]
        }


-- transform container model to xml
instance ModelRenderer ContainerModel where
    makeElement cm = Xml.Element
        { Xml.elementName       = makeName (Txt.pack "container")
        , Xml.elementAttributes = convertTxt2NameMap
                                      (addIdType2Props containerInfo cm)
        , Xml.elementNodes      = map (Xml.NodeElement . makeElement)
                                      (containerData cm)
        }

Проблема в том, что я не могу понять, как сделать ContainerData с моими текущими знаниями по Haskell. Я хочу перепроверить значение, которое составляет ContainerData, но я знаю, что это не способ haskell. Есть предложения?

...