如何在Haskell中实现多种外部格式的数据多态?

时间:2014-03-19 22:44:32

标签: haskell serialization type-conversion

我需要为语义上等效的数据处理多种格式和版本。

我可以为每个模式(例如XSD)生成Haskell数据类型,它们在技术上会有所不同,但在许多情况下在语义和结构上都是相同的。

数据很复杂,包括引用,服务组件必须处理整个图并产生类似的响应(组件可能只是更新字段,但可能需要分析整个图来收集所有必需的信息,可能会调用其他服务作为孔)。

  • 我如何将ns1:addressns2:adress表示为具有countrystreet元素的多态类型,并且应用程序需要将它们视为相同,但保留序列化上下文以便写入正确格式的响应(一个表示可能会将它们编码为单个字符串,而其他表示也可能带有多余的复杂数据)?
  • 我能在多大程度上编写代码来定义数据,业务逻辑的语义等价并生成所有其他内容?我应该将Haskell语言或库中的哪些功能评估为潜在解决方案的构建块?

2 个答案:

答案 0 :(得分:1)

一个选项是为每个模式创建数据类型,并创建一个函数以将它们映射到公共数据类型。按照您的意愿处理它。您不需要创建多态类型。

这种方法与Pandoc类似:你得到一堆读者来解析文档到一个公共文档结构,然后使用编写器将该公共结构转换为特定的格式。

您只需要库来读取复杂的输入数据(如有必要,可以将其写回)。其余的是函数和数据类型。

如果您真的在处理图表,可以查看the Data.Graph module

答案 1 :(得分:0)

听起来这是Type Class基础架构和Lens库提供的问题。

  • 使用Type Class为各种实现定义标准且一致的高级接口。确保您专注于您希望执行的操作,而不是基础实现或过程。

  • 使用Lens es和Prism来访问基础数据类型并返回查询答案,并修改值"就地",而不是诉诸于完整序列化/反序列化。