Я новичок в 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. Есть предложения?