我是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方法。有什么建议吗?
我认为您可以为此使用模式匹配。有点像
instance ModelRenderer ContainerData where
makeElement (NestedCons cm) = makeElement cm
makeElement (SimpleCons um) = makeElement um
您可以将其调整为完整的ContainerModel
,并添加所需的标签。