我需要为语义上等效的数据处理多种格式和版本。
我可以为每个模式(例如XSD)生成Haskell数据类型,它们在技术上会有所不同,但在许多情况下在语义和结构上都是相同的。
数据很复杂,包括引用,服务组件必须处理整个图并产生类似的响应(组件可能只是更新字段,但可能需要分析整个图来收集所有必需的信息,可能会调用其他服务作为孔)。
ns1:address
和ns2:adress
表示为具有country
和street
元素的多态类型,并且应用程序需要将它们视为相同,但保留序列化上下文以便写入正确格式的响应(一个表示可能会将它们编码为单个字符串,而其他表示也可能带有多余的复杂数据)?答案 0 :(得分:1)
一个选项是为每个模式创建数据类型,并创建一个函数以将它们映射到公共数据类型。按照您的意愿处理它。您不需要创建多态类型。
这种方法与Pandoc类似:你得到一堆读者来解析文档到一个公共文档结构,然后使用编写器将该公共结构转换为特定的格式。
您只需要库来读取复杂的输入数据(如有必要,可以将其写回)。其余的是函数和数据类型。
如果您真的在处理图表,可以查看the Data.Graph
module。
答案 1 :(得分:0)
听起来这是Type Class基础架构和Lens
库提供的问题。
使用Type Class为各种实现定义标准且一致的高级接口。确保您专注于您希望执行的操作,而不是基础实现或过程。
使用Lens
es和Prism
来访问基础数据类型并返回查询答案,并修改值"就地",而不是诉诸于完整序列化/反序列化。