Haskell将adt作为xml设计问题

问题描述 投票:0回答:1

我是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)

这些是我的模特。它们主要是受here的启发。这是我的渲染功能:


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)
        }

问题是,根据我目前对haskell的了解,我不知道如何渲染ContainerData。我想对构成ContainerData的值进行类型检查,但我知道这不是haskell方法。有什么建议吗?

haskell functional-programming xml-serialization typeclass abstract-data-type
1个回答
0
投票

我认为您可以为此使用模式匹配。有点像

instance ModelRenderer ContainerData where
    makeElement (NestedCons cm) = makeElement cm
    makeElement (SimpleCons um) = makeElement um

您可以将其调整为完整的ContainerModel,并添加所需的标签。

© www.soinside.com 2019 - 2024. All rights reserved.